検索条件
全3件
(1/1ページ)
#include <stdio.h>
#include <math.h>
#include <fenv.h>
int main()
{
volatile double x, y, z;
x = 2.;
fesetround(FE_DOWNWARD);
y = sqrt(x);
fesetround(FE_UPWARD);
z = sqrt(x);
fesetround(FE_TONEAREST);
if (y == z) {
printf("sqrt error\n");
}
}
このようなプログラムで、cc cygwin-sqrt.cのように最適化オプションをつけないでコンパイルしたとき、丸めの向きが上向きでも下向きでも結果が同じになってしまいます。
cc -O3 cygwin-sqrt.cのように最適化をかければ問題ありません。いろいろ試すと、-O0ではアウト、-O1, -O2, -O3はセーフでした。
call sqrt
と呼んでいるのに対して、-O3だと
sqrtsd %xmm0, %xmm1
のようにSSE2で直接計算するコードが生成されているので、どうやら外部(libm?)のsqrtに問題がありそうです。