我正在使用-ffast-math
选项编译以下代码:
#include <limits>
#include <cmath>
#include <iostream>
int main() {
std::cout << std::isnan(std::numeric_limits<double>::quiet_NaN() ) << std::endl;
}
我的输出为0。我的代码如何用-ffast-math
编译浮点数是否为NaN?
注意:在linux上,std :: isnan甚至可以使用-ffast-math。
答案 0 :(得分:10)
由于-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 :(得分:1)
在linux上,gcc标志-ffast-math
打破isnan()
,isinf()
和isfinite()
- 可能还有其他相关的功能也被打破,我还没有测试过。< / p>
在括号中包装函数/宏的技巧也不起作用(即。(isnan)(x)
)
删除-ffast-math
有效; - )