代码之家  ›  专栏  ›  技术社区  ›  hhafez

C:双精度=0是什么意思?

  •  7
  • hhafez  · 技术社区  · 17 年前

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

    在C中-0的双精度值是什么意思?

    顺便说一下,当我检查它是否与0相等时,它返回true:要进行比较,我只需执行以下操作

    在gdb中

    > print some_double
    -0
    > print some_double == 0
    1
    
    3 回复  |  直到 17 年前
        1
  •  16
  •   Randolpho    13 年前

    Negative zero 是数值计算的一个有用概念,在C语言中是一个有效的浮点数。

        2
  •  3
  •   dirkgently    17 年前

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

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

        3
  •  2
  •   hhafez    16 年前

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

    零有两种表示(符号位设置或清除) . 一般来说,这只对设计浮点软件或硬件系统的人员很重要。

    重点矿山