Я использую функцию sqrt() из математической библиотеки, когда я строю для 64-битной системы, используя -m64, я получаю правильный результат, но когда я строю для 32-битной системы, у меня очень непоследовательное поведение.
Например, на 64-битном
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.