2013-10-07 20 views
8

Под версией g ++ версии 4.8.0 (32-разрядная версия) квадратный корень -0.0 (двоичное представление 0x8000000000000000) - это NAN. Но я мог бы поклясться, что более ранние версии (я не уверен, какой, но в последний раз, когда я запускал весь комплект тестов), возвращался просто 0.0, что кажется мне более разумным.Квадратный корень отрицательного нуля

Это право? Что-то в стандарте C++ изменилось, или это изменение g ++?

ответ

8

Это нестандартное поведение среды MinGW (что я также косвенно наблюдал за клиентом, для которого программное обеспечение, над которым я работаю, неожиданно проваливалось).

Возможно, вы видели правильный результат для sqrt(-0.), то есть -0., с более высоким уровнем оптимизации, где значение было рассчитано правильно во время компиляции или с предыдущей версией времени выполнения, в котором ошибка отсутствовала ,

я в конечном итоге определения мой собственный «фиксированный» sqrt() как:

double mysqrt(double x) { 
    if (x == 0.) return x; else return sqrt(x); 
} 

(*) IEEE 754 Определяет sqrt(-0.) как -0.. Компилятор C или C++ не должен реализовывать IEEE 754 для арифметики с плавающей запятой, но GCC пытается (и в этом конкретном случае сбой).

+1

Я думаю, что технически GCC - это просто компилятор и компоновщик, а не все стандартные библиотеки. В документации GCC говорится, что пользователь должен предоставить некоторые из средств библиотеки. Таким образом, GCC не пытается предоставить 'sqrt', поэтому он не выдаст правильный результат для' sqrt (-0.) '. В MinGW библиотеки поступают из среды Windows. –

+1

Из [документации GCC] (http://gcc.gnu.org/onlinedocs/gcc-4.8.1/gcc/Standards.html#Standards): «GCC не предоставляет библиотечные возможности, необходимые только для размещенных внедрений, а также но все средства, требуемые C99 автономных реализаций; для использования возможностей размещенной среды вам нужно будет найти их в другом месте (например, в библиотеке GNU C) ». –

+0

Спасибо за это! Я начинал задаваться вопросом, представлял ли я себе более раннее поведение. – TonyK

Смежные вопросы