在我的代码中

float f = -0.0; // Negative

并与负零比较
f == -0.0f

结果将是true


float f = 0.0; // Positive

并与负零比较
f == -0.0f

同样,结果将是true而不是false
为什么在两种情况下结果都是正确的?

这是a MCVE to test it (live on 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

最佳答案

C++中的浮点运算通常是IEEE-754。该规范不同于实数集的数学定义。

此规范defines two different representations for the value zero: positive zero and negative zero。还定义了这两个表示必须比较等于,因此根据定义:

+0.0 == -0.0

关于其原因,David Goldberg在1991-03年的论文What Every Computer Scientist Should Know About Floating Point Arithmetic中(链接到IEEE网站的IEEE-754页)写道:

关于c++ - 负零(-0.0)与正零(+0.0)的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43086963/

10-09 06:25