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

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

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

在gdb中

> print some_double
-0
> print some_double == 0
1
有帮助吗?

解决方案

负零点是一个有用的数值计算概念,是一个有效的浮点数。下进行。

其他提示

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

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

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

  

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

强调我的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top