【问题标题】:Is it right output of C programe [duplicate]它是C程序的正确输出吗[重复]
【发布时间】:2011-10-12 12:18:23
【问题描述】:

可能重复:
Floating point comparison

我有一些简单的 C 代码,输出似乎出乎意料,至少对我来说:

#include <stdio.h>

int main(void) {
    float f1 = 1.0;
    double f2 = 1.0;

    if (f1 == f2)
        puts("equal");
    else
        puts("unequal");

    return 0;
}

由于floatdouble 具有不同的精度,我预计输出为unequal,但我得到的是equal。为什么会这样?

【问题讨论】:

  • 我们又来了……在尝试更多的浮点编程之前,请阅读以下文档:download.oracle.com/docs/cd/E19957-01/806-3568/…
  • 请将其链接到重复的问题
  • @PaulR 我问的有点不一样!!
  • 不是真的 - 这只是问题的必然结果,这已包含在 许多 重复/相关问题的答案中。
  • @paxdiablo:请不要让我拖网寻找所有其他的骗子... ;-)

标签: c


【解决方案1】:

只有当数字不能准确表示时,精度才重要。由于浮点数和双精度数(即 IEEE 754 单精度和双精度值)都可以准确地表示 1.0,因此精度不包括在内。

1.0 基本上是一个零符号位,除了最高位之外的所有指数位都设置为 1,并且没有设置尾数位。在单精度中,这是二进制:

0-01111111-00000000000000000000000

并且,对于双精度:

0-01111111111-0000000000000000000000000000000000000000000000000000

并非所有数字都可以在 IEEE 754 中精确表示 - 例如,您在评论中提到的 1.1 实际上以单精度存储为 1.100000023841858

查看this answer 以获取解码浮点值的示例。

Harald Schmidt's online single-precision converter 是一个很好的网站,如果您想了解这些格式,可以尝试一下。我非常喜欢它,我制作了一个桌面版本以防它消失(并且还能够进行双精度)。

【讨论】:

    【解决方案2】:

    这不是类型,而是它比较的值,在这种特殊情况下不会发生近似错误,因此它们是相等的。 Float 具有单精度 IEEE754 格式,double 具有双精度格式,两种格式的近似值相同,不会出现错误。您可以获取一些不能通过浮点数存储但双精度数的小数值,并使用您的代码对其进行测试。这种比较不应该在实际代码中进行,因为溢出和近似错误会意外地分支执行(例如循环中的浮点比较)。

    【讨论】:

      【解决方案3】:

      尝试对例如.3 执行相同的操作。当数字在基数 2 表示中是周期性的时,就会出现问题。无论如何比较 double 和/或 float 是不正确的,但我想从你的问题中你已经知道了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多