Mingw32 std::isnan с -ffast-math
Я компилирую следующий код с -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 ответа
Решение
Поскольку -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
В Linux флаг gcc -ffast-math
брейки isnan()
, isinf()
а также isfinite()
- могут быть другие связанные функции, которые также не работают, которые я не проверял.
Трюк с обертыванием функции / макроса в скобках также не сработал (т.е. (isnan)(x)
)
Удаление -ffast-math
работает;-)