7

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

C中-0值的双倍是什么意思?

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

在 gdb 中

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

3 回答 3

16

负零是数值计算的有用概念,并且是 C 中的有效浮点数。

于 2009-03-06T00:34:58.953 回答
3

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

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

于 2009-03-06T00:35:26.673 回答
2

实际上阅读第 4 章中的“Writing great code, Volume 1”一书作者给出的答案非常清楚,这是因为在 IEEE FP 标准中使用 1 的补码来表示有符号浮点数。他说:

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

强调我的

于 2010-01-14T00:58:01.987 回答