C:对于= = -0这个双子来说意味着什么?

时间:2009-03-06 00:33:30

标签: c double

我只是使用gdb打印出double的值,令我惊讶的是打印了-0

C中-0值的两倍是多少?

顺便说一句,当我检查它与0的相等时,它返回true:要进行比较,我只是做了以下

在gdb中

> print some_double
-0
> print some_double == 0
1

3 个答案:

答案 0 :(得分:16)

Negative zero是数值计算的有用概念,是C中的有效浮点数。

答案 1 :(得分:3)

printf这是众所周知的问题。由于您使用的是浮点数,因此二进制文件中没有可能的表示形式。大多数情况下,二进制表示并不完美。因此,有时将0存储为0.00000000000000...0042,并将-0.000000000000000000000123存储为a == b。当printf打印第二个时,你得到奇数-0。

我真的不知道你是如何与0比较的,只记得在进行浮点比较时添加一个epsilon来调整奇数。例如:测试两个浮点数是否相等从不写fabs(a-b) < 1e-13但{{1}}其中1e-13是epsilon(选择适合你的指数)。

答案 2 :(得分:2)

实际上,在第4章中阅读“编写优秀代码,第1卷”一书时,作者非常清楚地给出了答案,因为在IEEE FP标准中使用1的补码来表示有符号浮点数。他说:

  

尾数使用一个补码格式而不是二进制补码。这意味着尾数的24位值仅是无符号二进制数,并且位位置31中的符号位确定该值是正还是负。一个补码数具有不寻常的属性,有两个零表示(符号位设置或清除)。通常,这仅对设计浮点软件或硬件系统的人很重要。

强调我的