Mingw32 std::isnan 与 -ffast-math

发布于 2024-12-02 12:16:24 字数 416 浏览 1 评论 0原文

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

I am compiling the following code with the -ffast-math option:

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

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

I am getting 0 as output. How can my code tell whether a floating point number is NaN when it is compiled with -ffast-math?

Note: On linux, std::isnan works even with -ffast-math.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

薄情伤 2024-12-09 12:16:25

由于 -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

Since -ffast-math instructs GCC not to handle NaNs, it is expected that isnan() has an undefined behaviour. Returning 0 is therefore valid.

You can use the following fast replacement for 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
鹊巢 2024-12-09 12:16:25

在 Linux 上,gcc 标志 -ffast-math 会破坏 isnan()isinf()isfinite() - 可能还有其他我没有测试过的相关功能也被破坏了。

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

删除 -ffast-math 有效;-)

On linux, the gcc flag -ffast-math breaks isnan(), isinf() and isfinite() - there may be other related functions that are also broken that I have not tested.

The trick of wrapping the function/macro in parentheses also did not work (ie. (isnan)(x))

Removing -ffast-math works ;-)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文