我有简单的C代码和输出出来是不期而至我
main()
{
float f1 = 1.0;
double f2 = 1.0;
if(f1==f2)
printf("Equal");
else
printf("unequal");
}
我期待的结果是“不平等”,但产出是相等的。为什么?
由于浮点和双精度具有不同的精度,输出应该是不相等的。
我有简单的C代码和输出出来是不期而至我
main()
{
float f1 = 1.0;
double f2 = 1.0;
if(f1==f2)
printf("Equal");
else
printf("unequal");
}
我期待的结果是“不平等”,但产出是相等的。为什么?
由于浮点和双精度具有不同的精度,输出应该是不相等的。
只有当数字不能准确表示时,精度才有意义。由于浮点数和双精度(即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是有,如果你想了解该格式的播放围绕一个优秀的网站。我非常喜欢它,我制作了一个桌面版本以防万一它消失了(并且能够做到双精度)。
为什么它来价值1.1? –
@Amit,这是因为'1.1'不完全可以表示。它的工作原理是单精度的“1.100000023841858”。 – paxdiablo
这不是类型,它是什么它比较值,在这种特殊情况下不会发生逼近误差,因此,这些都是平等的。 Float具有单精度IEEE754格式,double具有双精度格式,两种格式的近似值都是相同的,并且不会出现错误。你可以取一些不能用float存储的小数值,然后用你的代码进行测试。这种比较不应该用真正的代码完成,因为溢出和逼近错误会意外地分支执行(例如循环中的float比较)。
尝试做相同的,例如.3
。当基数2表示中的数字是周期性时出现问题。在任何情况下,比较double和/或float都是不正确的,但我想你的问题你已经知道了。
这里我们再次...在尝试使用浮点编程之前,请阅读以下文档:http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html –
请把它连接到重复的问题 –
@PaulR我问的是有点不同! –