我只是使用 gdb 打印出一个 double 的值,令我惊讶的是它打印了 -0
C中-0值的双倍是什么意思?
顺便说一句,当我检查它与 0 的相等性时,它返回了 true:为了进行比较,我只做了以下操作
在 gdb 中
> print some_double
-0
> print some_double == 0
1
负零是数值计算的有用概念,并且是 C 中的有效浮点数。
这是一个众所周知的问题printf
。由于您使用的是浮点数,因此二进制中不可能有一种表示形式。而且大多数时候二进制表示并不完美。因此,0 存储为0.00000000000000...0042
有时和-0.000000000000000000000123
。当 printf 打印第二个时,你得到奇数 -0。
我真的不知道你是如何与 0 进行比较的,只记得在进行浮点比较时添加一个 epsilon 以调整奇数。例如:测试两个浮点数是否相等永远不要写a == b
,但fabs(a-b) < 1e-13
1e-13 是 epsilon(选择一个适合您的指数)。
实际上阅读第 4 章中的“Writing great code, Volume 1”一书作者给出的答案非常清楚,这是因为在 IEEE FP 标准中使用 1 的补码来表示有符号浮点数。他说:
尾数使用一个补码格式而不是二进制补码。这意味着尾数的 24 位值只是一个无符号二进制数,位位置 31 中的符号位确定该值是正数还是负数。一个补码具有不寻常的特性,即零有两种表示(符号位设置或清除)。通常,这仅对设计浮点软件或硬件系统的人很重要。
强调我的