2013-03-26 34 views
0

我计算出下面的代码并得到了一个奇怪的结果。任何人都可以解释它如何工作?浮点值条件

main() 
{ 
    float a=0.8; 
    float b=0.25; 
    if(a==0.8) 
     printf("HELLO") 
    if(b==0.25) 
     printf("WORLD") 
} 

而且,我得到的输出是令人惊讶的

WORLD 

由于事先

回答

5

这是因为0.25是2的幂(即2^-2),而0.8是不。只能精确地表示两个幂的精确总和;所有其他数字(包括0.8)都表示为近似值,其在floatdouble之间具有不同的精度。 a==0.8中的0.8double,而afloat。他们的表述是不同的,他们的价值观也是不同的。

+0

你是最快的枪SO ,伙计。我点击“发布你的答案”,我真的很快。 – 2013-03-26 13:39:52

+0

只需添加一个printf(“%1.12f”,a); 到你的代码,你会看到舍入错误 – Sibster 2013-03-26 13:47:53

3

您绝对不能比较float-与绝对值相同的值。通常存在轻微的舍入误差,因为浮点数是根据IEEE 754来表示的,并且机器无法提供精确的浮点值。

看看here为您的解释,特别是舍入规则。

+0

这里有什么错?为什么downvote? – 2013-03-26 14:07:30

+0

现在你得到另一个抱怨:​​p – 2013-03-26 14:26:52

+0

仍然没有得到它...... – 2013-03-26 14:30:48

2

要针对双比较FLOAT。尝试把一个f

if(a==0.8f) 
    printf("HELLO") 
if(b==0.25f) 
    printf("WORLD") 
0

一切最终存储在比特数之后....所以浮点拿到情况下,它们的二进制等价物重复四舍五入...