2010-02-25 70 views
1

我无法在这个简单的代码错误中做出这种比较..我在做什么,是什么原因? ...简单比较使用双倍数据速率的数据

#include <stdio.h> 

int main() 
{ 
    double a = 0.0; 
    double b = 1.0; 
    double c = 0.1; 

    while(a != b) 
     a=a+c; 

    printf("Suma hasta 1 completada\n"); 
} 

回答

3

让它while (a <= b)

操作双(和数据类型本身)与精度的问题。所以,避免使用double == double或double!= double表达式。用<或>重新排列它们。可能在第10次迭代之后,c是1.00000 .. 001,而不是1.这主要是由于双重类型的内部表示。

+0

我读的地方,一些语言如Java是隐藏的精度问题。真的吗 ? – 2010-02-25 13:37:32

+0

“隐藏”是什么意思?有些类型使用不同的内部表示形式(对于c# - 十进制),它们不会失去精度。可能在Java中有类似的类型(我认为BigDecimal很合适)。但我不确定是否可以隐藏精确问题。你可以查看这篇文章:http://discuss.joelonsoftware.com/default.asp?design.4.346343.29它解释了Java的小数点,我认为仍然是一个问题。 – anthares 2010-02-25 13:46:15

1

并非所有的十进制数都可以用双浮点格式来精确表示。

在你的例子中,常数0.1是问题的根源。即使您在源代码中写入了0.1,双倍格式的下一个最佳表示也是0.1000000000000000056。

因此,比较永远不会与真实比较。

另请注意,不仅常数有问题。所有的算术(在你的情况下)也具有有限的精度问题。