2011-11-25 28 views
0

可能重复:
strange output in comparision of float with float literal为什么在'if'条件下浮点值条件失败?

下面是代码

#include<stdio.h> 
int main() 
{ 
float a=0.3; 
if(a==0.3) 
    printf("Hello World!"); 
else 
    printf("Stack Overflow"); 
return 0; 
} 

我的预期输出的 “Hello World”。但是我得到了“堆栈溢出”。为什么我没有得到“Hello World”?

if条件有问题吗?

+0

没有做过'C'但我想这应该是浮'一== 0.3f'; –

+0

在这种情况下,'a'被提升为'double',因为'0.3'是一个双字面值。由于'0.3'不能完全表示,所以比较失败。 –

+1

大卫说:“(double)(float)(0.3)'不等于'0.3',因为前者在整个过程中四舍五入为精确的,而后者保留了double精度。以10为底的比喻,假设我拿'1/3'代表3位有效数字:'0.333'。这就是“浮动”a“。现在将“a”的值转换为有效数字为6的值(“double”):“0.333000”。这不等于'0.333333'(三分之一的值为“双倍”)。 –

回答

0

浮点值不得使用==!=运算符进行比较。 大多数浮点值没有精确的二进制表示,并且精度有限。 See what you can do

5

Comparing floating point numbers

浮点运算并不精确。像0.2这样的简单值不能用二进制浮点数精确表示,并且浮点数的有限精度意味着操作顺序的轻微变化可能会改变结果。不同的编译器和CPU体系结构以不同的精度存储临时结果,因此结果会因环境的细节而有所不同。如果你做了一个计算,然后将结果与一些预期值进行比较,那么你很可能得不到你想要的结果。

试试这个方法:

#include<stdio.h> 
int main() 
{ 
float a=0.3; 
float acceptedDiff = 0.0000001; 
if(fabsf(a-0.3) < acceptedDiff) 
    printf("Hello World!"); 
else 
    printf("Stack Overflow"); 
return 0; 
} 
+0

感谢MichałPowaga :) – Dinesh

+0

正确和最安全的方法是始终查看2个数字之间的相对差异,而不是差异。 –

0

这是因为像0.3的值不能准确地用二进制浮点数字表示。临时值的存储方式不同,因此无法与此相比较。 a和0.3的值因此存储方式不同,您不能依赖这种直接比较。

0

是因为据我所知,而IF语句比较变量和值它进入价值的机器级信息和存储。

第一行你声明a = 0.3为浮点类型,所以它将以二进制格式存储在内存中,并带有额外的填充位。当你将它与Exact“0.3”进行比较时,它总是会失败。

2

试一下:)

if (a == 0.3f) 

if (a == (float)0.3)