它是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;
由于float
和double
具有不同的精度,我预计输出为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个整数,把其中重复出现的数删去 输出删除重复数后的各数