C ランタイムライブラリの pow 関数が意図しない結果を返す


pow(10, -1);

上記コードの戻り値として、Visual C++ 6.0 などの以前のバージョンの CRT では "0.1" が返りますが、Visual C++ .NET 2003 の CRT では、"0" が返ります。

との事。

確かに、math.h 515行目近辺にこんなコードがありますねぇ。

template inline
        _Ty _Pow_int(_Ty _X, int _Y)
        {unsigned int _N;
        if (_Y >= 0)
                _N = _Y;
        else
                _N = -_Y;
        for (_Ty _Z = _Ty(1); ; _X *= _X)
                {if *1; }

戻り値が double であれば、やっぱり double な浮動小数点が返る事を期待しちゃうわけですが、_Pow_int の第一引数&戻り値がテンプレートになってますからねぇ。整数型がきてしまうと必然的に小数点が使えないことに。

…ん〜、バグやな。コレは。(笑

*1:_N & 1) != 0) _Z *= _X; if ((_N >>= 1) == 0) return (_Y < 0 ? _Ty(1) / _Z : _Z); }} inline double __cdecl pow(int _X, int _Y) {return (_Pow_int(_X, _Y