Mingw32 std :: isnan с -ffast-math - PullRequest
       54

Mingw32 std :: isnan с -ffast-math

2 голосов
/ 01 сентября 2011

Я компилирую следующий код с опцией -ffast-math:

#include <limits>
#include <cmath>
#include <iostream>

int main() {
    std::cout << std::isnan(std::numeric_limits<double>::quiet_NaN() ) << std::endl;
}

Я получаю 0 в качестве вывода. Как мой код может сказать, является ли число с плавающей точкой NaN, когда оно компилируется с -ffast-math?

Примечание. В linux std :: isnan работает даже с -ffast-math.

Ответы [ 2 ]

10 голосов
/ 17 сентября 2011

Поскольку -ffast-math указывает GCC не обрабатывать NaN с, ожидается, что isnan() имеет неопределенное поведение. Следовательно, возврат 0 действителен.

Вы можете использовать следующую быструю замену для isnan():

#if defined __FAST_MATH__
#   undef isnan
#endif
#if !defined isnan
#   define isnan isnan
#   include <stdint.h>
static inline int isnan(float f)
{
    union { float f; uint32_t x; } u = { f };
    return (u.x << 1) > 0xff000000u;
}
#endif
1 голос
/ 22 сентября 2011

В Linux флаг gcc -ffast-math ломает isnan(), isinf() и isfinite() - могут быть и другие связанные функции, которые также не работают, которые я не тестировал.

Трюк с функцией / макросом в скобках также не сработал (т. Е. (isnan)(x))

Удаление -ffast-math работает; -)

...