2011-10-12 46 views
0

可能重复:
Floating point comparison它是不是C PROGRAME的右输出

我有简单的C代码和输出出来是不期而至我

main() 

{ 

    float f1 = 1.0; 

    double f2 = 1.0; 

    if(f1==f2) 

printf("Equal"); 

else 

    printf("unequal"); 

    } 

我期待的结果是“不平等”,但产出是相等的。为什么?

由于浮点和双精度具有不同的精度,输出应该是不相等的。

+3

这里我们再次...在尝试使用浮点编程之前,请阅读以下文档:http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html –

+0

请把它连接到重复的问题 –

+0

@PaulR我问的是有点不同! –

回答

8

只有当数字不能准确表示时,精度才有意义。由于浮点数和双精度(即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是有,如果你想了解该格式的播放围绕一个优秀的网站。我非常喜欢它,我制作了一个桌面版本以防万一它消失了(并且能够做到双精度)。

+0

为什么它来价值1.1? –

+0

@Amit,这是因为'1.1'不完全可以表示。它的工作原理是单精度的“1.100000023841858”。 – paxdiablo

2

这不是类型,它是什么它比较值,在这种特殊情况下不会发生逼近误差,因此,这些都是平等的。 Float具有单精度IEEE754格式,double具有双精度格式,两种格式的近似值都是相同的,并且不会出现错误。你可以取一些不能用float存储的小数值,然后用你的代码进行测试。这种比较不应该用真正的代码完成,因为溢出和逼近错误会意外地分支执行(例如循环中的float比较)。

1

尝试做相同的,例如.3。当基数2表示中的数字是周期性时出现问题。在任何情况下,比较double和/或float都是不正确的,但我想你的问题你已经知道了。