C ランタイムライブラリの pow 関数が意図しない結果を返す
pow(10, -1);
上記コードの戻り値として、Visual C++ 6.0 などの以前のバージョンの CRT では "0.1" が返りますが、Visual C++ .NET 2003 の CRT では、"0" が返ります。
との事。
確かに、math.h 515行目近辺にこんなコードがありますねぇ。
templateinline _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