I'm using sqrt() function from math library, when I build for 64 bit using -m64 I'm getting correct result but when I build for 32 bit I have very inconsistent behaviour.
For example on 64bit
double dx = 0x1.fffffffffffffp+1023;
sqrt(dx); // => 0x1.fffffffffffffp+511
sqrt(0x1.fffffffffffffp+1023);// => 0x1.fffffffffffffp+511
(which I believe is the correctly rounded result, verified with mpfr)
But on 32 bit same input value it behaves differently.
double dx = 0x1.fffffffffffffp+1023;
sqrt(dx); // => 0x1.0p+512
sqrt(0x1.fffffffffffffp+1023); // => 0x1.fffffffffffffp+511
When the same value passed in a variable I'm getting wrong result.
I checked rounding mode before and after each call and all are set to round to nearest.
What the reason?
I'm using gcc 4.6 on a 64bit machine, and options are -mfpmath=sse
and -march=pentium
for both x86 nad x64 cases.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…