2

我正在使用-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。

4

2 回答 2

10

由于-ffast-math指示 GCC 不处理NaNs,因此预期它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
于 2011-09-17T14:26:50.947 回答
1

在 linux 上, gcc 标志-ffast-math中断isnan()isinf()并且isfinite()- 可能还有其他相关功能也被破坏,我没有测试过。

将函数/宏括在括号中的技巧也不起作用(即。(isnan)(x)

删除-ffast-math作品;-)

于 2011-09-21T21:34:45.233 回答