它是C程序的正确输出吗[重复]

Posted

技术标签:

【中文标题】它是C程序的正确输出吗[重复]【英文标题】:Is it right output of C programe [duplicate] 【发布时间】: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:请不要让我拖网寻找所有其他的骗子... ;-) 【参考方案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 是不正确的,但我想从你的问题中你已经知道了。

【讨论】:

以上是关于它是C程序的正确输出吗[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c语言编程序,输入10个整数,把其中重复出现的数删去 输出删除重复数后的各数

ZZNUOJ_用C语言编写程序实现1371:无重复的排序(附完整源码)

C ++:检查输入数据[重复]

这是正确使用new和delete - c ++ [重复]

C程序给出不正确的输出?

请问有往届蓝桥杯试题吗,C本科组的,最好有答案呀~~~发我邮箱:447472614@qq.com