我计算出下面的代码并得到了一个奇怪的结果。任何人都可以解释它如何工作?浮点值条件
main()
{
float a=0.8;
float b=0.25;
if(a==0.8)
printf("HELLO")
if(b==0.25)
printf("WORLD")
}
而且,我得到的输出是令人惊讶的
WORLD
由于事先
我计算出下面的代码并得到了一个奇怪的结果。任何人都可以解释它如何工作?浮点值条件
main()
{
float a=0.8;
float b=0.25;
if(a==0.8)
printf("HELLO")
if(b==0.25)
printf("WORLD")
}
而且,我得到的输出是令人惊讶的
WORLD
由于事先
这是因为0.25是2的幂(即2^-2),而0.8是不。只能精确地表示两个幂的精确总和;所有其他数字(包括0.8)都表示为近似值,其在float
和double
之间具有不同的精度。 a==0.8
中的0.8
是double
,而a
是float
。他们的表述是不同的,他们的价值观也是不同的。
您绝对不能比较float
-与绝对值相同的值。通常存在轻微的舍入误差,因为浮点数是根据IEEE 754来表示的,并且机器无法提供精确的浮点值。
看看here为您的解释,特别是舍入规则。
这里有什么错?为什么downvote? – 2013-03-26 14:07:30
现在你得到另一个抱怨:p – 2013-03-26 14:26:52
仍然没有得到它...... – 2013-03-26 14:30:48
给出的答案是正确的......上多布博士安德鲁·柯尼希被写浮筒顺序关系,有一个观点:
我没有看到这两个文章中的问题的答案。答案是'a'是'0.8f','0.8f'与双精度常数'0.8'不同。 – 2013-03-26 17:12:09
要针对双比较FLOAT。尝试把一个f
if(a==0.8f)
printf("HELLO")
if(b==0.25f)
printf("WORLD")
一切最终存储在比特数之后....所以浮点拿到情况下,它们的二进制等价物重复四舍五入...
你是最快的枪SO ,伙计。我点击“发布你的答案”,我真的很快。 – 2013-03-26 13:39:52
只需添加一个printf(“%1.12f”,a); 到你的代码,你会看到舍入错误 – Sibster 2013-03-26 13:47:53