MSVC 中可能存在的错误与编译时 NaN 比较

Probable bug in MSVC with compile-time NaN comparison

提问人:prapin 提问时间:3/1/2021 最后编辑:phuclvprapin 更新时间:3/18/2021 访问量:201

问:

我的同事正在用 NaN 做一些基本的实验,对 Visual Studio 上不符合他预期的行为感到困惑。经过讨论,他似乎在 MSVC 2019 中发现了一个可能的编译器错误。

此代码片段无法在 MSVC 上编译,但在 Clang 和 GCC 上很好:

#include <limits>

int main()
{
    static_assert(!(1 < std::numeric_limits<double>::quiet_NaN()), "compiler bug?");
}

演示:https://godbolt.org/z/xGdqd5

Il 似乎问题涉及常数的编译时比较,这在现实生活中并不真正有用。std::numeric_limits<double>::quiet_NaN()

如果与 IEEE-754 预期的变量进行比较,则比较 and 始终为 false。><quiet_NaN

C visual-c++ 浮点 nan 编译器错误

评论

0赞 463035818_is_not_an_ai 3/1/2021
是什么让你确定这是一个编译器错误?
0赞 463035818_is_not_an_ai 3/1/2021
我认为您应该在之前检查一下,尽管对于 msvc 来说,它似乎成立std::numeric_limits<double>::has_quiet_NaN == true
2赞 Adrian Mole 3/1/2021
可能相关:C/C++ 中的 NaN 比较规则
0赞 Adrian Mole 3/1/2021
奇怪的是,MSVC 输出以下内容: .所以它看起来像一个错误。falsestd::cout << std::boolalpha << (1 < std::numeric_limits<double>::quiet_NaN()) << std::endl;
1赞 prapin 3/1/2021
@largest_prime_is_463035818我不确定,这就是我问的原因。我以为 C++ 会限制 IEE-754,但从 Adrian Mode 评论来看,这似乎不在标准中。

答: 暂无答案