gpt4 book ai didi

c++ - 如果任一参数为 NaN,什么会导致 C/C++ <、<= 和 == 运算符返回 true?

转载 作者:IT老高 更新时间:2023-10-28 14:01:18 26 4
gpt4 key购买 nike

我对 IEEE-754 浮点比较规则的理解是,除了 != 之外的所有比较运算符如果其中一个或两个参数都是 NaN,则返回 false,而 !=运算符将返回 true。我可以通过简单的独立测试轻松重现此行为:

for (int ii = 0; ii < 4; ++ii)
{
float a = (ii & 1) != 0 ? NAN : 1.0f;
float b = (ii & 2) != 0 ? NAN : 2.0f;
#define TEST(OP) printf("%4.1f %2s %4.1f => %s\n", a, #OP, b, a OP b ? "true" : "false");
TEST(<)
TEST(>)
TEST(<=)
TEST(>=)
TEST(==)
TEST(!=)
}

这会打印出预期的结果:(NaN 在 MSVC 运行时中被格式化为 -1.$)

 1.0  <  2.0 => true
1.0 > 2.0 => false
1.0 <= 2.0 => true
1.0 >= 2.0 => false
1.0 == 2.0 => false
1.0 != 2.0 => true
-1.$ < 2.0 => false
-1.$ > 2.0 => false
-1.$ <= 2.0 => false
-1.$ >= 2.0 => false
-1.$ == 2.0 => false
-1.$ != 2.0 => true
1.0 < -1.$ => false
1.0 > -1.$ => false
1.0 <= -1.$ => false
1.0 >= -1.$ => false
1.0 == -1.$ => false
1.0 != -1.$ => true
-1.$ < -1.$ => false
-1.$ > -1.$ => false
-1.$ <= -1.$ => false
-1.$ >= -1.$ => false
-1.$ == -1.$ => false
-1.$ != -1.$ => true

但是,当我将这段代码粘贴到应用程序的内部循环的深处时,所有浮点计算都在其中执行,我得到了这些莫名其妙的结果:

 1.0  <  2.0 => true
1.0 > 2.0 => false
1.0 <= 2.0 => true
1.0 >= 2.0 => false
1.0 == 2.0 => false
1.0 != 2.0 => true
-1.$ < 2.0 => true
-1.$ > 2.0 => false
-1.$ <= 2.0 => true
-1.$ >= 2.0 => false
-1.$ == 2.0 => true
-1.$ != 2.0 => false
1.0 < -1.$ => true
1.0 > -1.$ => false
1.0 <= -1.$ => true
1.0 >= -1.$ => false
1.0 == -1.$ => true
1.0 != -1.$ => false
-1.$ < -1.$ => true
-1.$ > -1.$ => false
-1.$ <= -1.$ => true
-1.$ >= -1.$ => false
-1.$ == -1.$ => true
-1.$ != -1.$ => false

由于某种原因,< , <= , 和 ==当一个或两个参数都是 NaN 时,运算符会意外返回 true。此外,!=运算符意外返回 false。

这是 64 位代码,使用 Visual Studio 2010 构建,在 Intel Xeon E5-2650 上运行。使用 _mm_getcsr() ,我已经确认 CSR 寄存器在两种情况下都保持相同的值。

还有什么可以像这样影响 float 学的行为?

最佳答案

此行为是由于 /fp:fast MSVC 编译器选项,它(除其他外)允许编译器执行比较而不考虑正确的 NaN 行为,以生成更快的代码。使用 /fp:precise/fp:strict相反,当出现 NaN 参数时,这些比较会按预期进行。

关于c++ - 如果任一参数为 NaN,什么会导致 C/C++ <、<= 和 == 运算符返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23641555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com