Я использую функцию sqrt() из математической библиотеки, когда я строю для 64-битного с использованием -m64. Я получаю правильный результат, но когда я строю для 32-битного, у меня есть очень непоследовательное поведение.поведение или sqrt при компиляции с 64 или 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 nad x64.
Кажется, одна ошибка открыта на этом по адресу http://sources.redhat.com/bugzilla/show_bug.cgi?id=14032, даже когда я использую -msse2 для 32-битного кода i386, который получает казнены. – kanna