与正零 (0.0) 相比,负零 (-0.0) 的行为

新手上路,请多包涵

在我的代码中,

 float f = -0.0; // Negative

并与 负零 比较

f == -0.0f

结果将是 true

float f = 0.0; // Positive

并与 负零 比较

f == -0.0f

此外,结果将是 true 而不是 false

为什么在这两种情况下结果都是正确的?


这是 一个 MCVE 来测试它(在 coliru 上直播)

 #include <iostream>

int main()
{
    float f = -0.0;

    std::cout<<"==== > " << f <<std::endl<<std::endl;

    if(f == -0.0f)
    {
        std::cout<<"true"<<std::endl;
    }
    else
    {
        std::cout<<"false"<<std::endl;
    }
}

输出:

 ==== > -0  // Here print negative zero

true

原文由 Jayesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
1 个回答

C++11 引入了诸如 std::signbit() 可以检测有符号零和 std::copysign() 之类的函数,如果实现支持有符号零(例如由于使用IEEE 浮点数)。这些函数的规范实际上并不要求实现支持不同的正零和负零。除了那种事情,我不知道 C++ 标准中的任何引用甚至提到了带符号的零,更不用说比较它们的结果了。

C++ 标准也没有规定任何浮点表示 - 这是实现定义的。

尽管不是确定的,但这些观察表明,对有符号零的支持或比较它们的结果将取决于实现支持的浮点表示。

IEEE-754 是现代实现(即其主机系统上的编译器)使用的常见(尽管不是唯一)浮点表示。当前(2008 年发布)版本的 IEEE-758“IEEE 浮点算术标准”第 5.11 节第二段说(粗体强调我的)

可能有四种互斥关系: _小于_、 _等于_、 大于 和 _无序_。最后一种情况出现在至少一个操作数是 NaN 时。每个 NaN 都应与包括自身在内的所有内容进行 无序 比较。 比较应忽略零符号(因此 +0 = -0)。 相同符号的无限操作数应比较 _相等_。

原文由 Peter 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题