双值为负零

jam*_*mes 1 c

我有一个程序示例:

int main()
{
    double x;
    x=-0.000000;
    if(x<0)
    {
        printf("x is less");
    }
    else 
    {
        printf("x is greater");
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么控件进入第一个语句 - x更少.什么是-0.000000?

Nat*_*man 9

IEEE 754定义了一个非常常用的标准浮点数.你可以在这里看到它的结构:

有限数,可以是基数2(二进制)或基数10(十进制).每个有限数由三个整数描述:s =符号(零或一),c =有效数(或'系数'),q =指数.有限数的数值是

  (?1)^s × c × bq
Run Code Online (Sandbox Code Playgroud)

其中b是基数(2或10).例如,如果符号为1(表示负数),则有效数为12345,指数为-3,基数为10,则数字的值为-12.345.

双FP号

因此,如果分数为0,并且符号为0,则为+0.0.
如果分数为0,符号为1,则为-0.0.

数字具有相同的值,但在正/负检查中它们不同.这意味着,例如,如果:

x = +0.0;
y = -0.0;
Run Code Online (Sandbox Code Playgroud)

然后你应该看到:

(x -y) == 0
Run Code Online (Sandbox Code Playgroud)

但是,对于x,OP的代码将使用"x is greater",而对于y,它将使用"x is less".

编辑: 阿图尔答案杰弗里萨克斯对这个答案的评论澄清说,x < 0OP问题中测试的差异实际上是编译器优化,实际上x < 0对于正面和负面的测试0应该始终如此false.

  • @hyde完全没有任何区别.整数0被提升为double(+0.0). (2认同)