различное поведение или sqrt при компиляции с 64 или 32 битами

Я использую функцию 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.

6
задан kanna 30 May 2012 в 01:28
поделиться