Я использую функцию sqrt () из математической библиотеки, когда я строю для 64-битной версии с использованием -m64, я получаю правильный результат, но когда я строю для 32-битной версии, у меня очень непоследовательное поведение.
Например на 64bit
double dx = 0x1.fffffffffffffp+1023;
sqrt(dx); // => 0x1.fffffffffffffp+511
sqrt(0x1.fffffffffffffp+1023);// => 0x1.fffffffffffffp+511
(который, я считаю, является правильно округленным результатом, подтвержденным с помощью mpfr)
Но на 32-битном одном и том же входном значении он ведет себя по-другому.
double dx = 0x1.fffffffffffffp+1023;
sqrt(dx); // => 0x1.0p+512
sqrt(0x1.fffffffffffffp+1023); // => 0x1.fffffffffffffp+511
Когда в переменную передается то же значение, я получаю неверный результат. Я проверил режим округления до и после каждого вызова, и все настроены на округление до ближайшего. В чем причина? Я использую gcc 4.6 на 64-битной машине, и варианты -mfpmath=sse
и -march=pentium
для обоих случаев x86 и x64.