2014/03/24(月)Visual Studioのsqrt
#include <float.h> #include <math.h> #include <stdio.h> int main() { volatile double r, x; _controlfp(_PC_53, _MCW_PC); x = 2.; _controlfp(_RC_UP, _MCW_RC); r = sqrt(x); _controlfp(_RC_NEAR, _MCW_RC); printf("%.17g\n", r); _controlfp(_RC_DOWN, _MCW_RC); r = sqrt(x); _controlfp(_RC_NEAR, _MCW_RC); printf("%.17g\n", r); return 0; }こんな感じのソースで、なぜか表示される値が同じになってしまう。
自分の環境はwin7 64bitで、Visual Studio 2008。
Visual Studio 2008 コマンドプロンプト (Win64じゃない方) でcl使ってコンパイルした。
64bitコンパイルすれば問題ない。
なんでだろ。FPU使わずに独自コード使ったりしてんのかな。
(2014年3月25日追記)
windows用のmatlabの古い奴 (R2007b) の32bit版で同じような現象を確認した。>> format hex >> system_dependent('setround', inf) >> 1/3 ans = 3fd5555555555556 >> sqrt(2) ans = 3ff6a09e667f3bcd >> system_dependent('setround', -inf) >> 1/3 ans = 3fd5555555555555 >> sqrt(2) ans = 3ff6a09e667f3bcd除算の丸めは変わっているけどsqrtは変わってない。windows用のmatlabはVisual C++でmakeされているのだろうか。