我无法在这个简单的代码错误中做出这种比较..我在做什么,是什么原因? ...简单比较使用双倍数据速率的数据
#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");
}
我无法在这个简单的代码错误中做出这种比较..我在做什么,是什么原因? ...简单比较使用双倍数据速率的数据
#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");
}
让它while (a <= b)
操作双(和数据类型本身)与精度的问题。所以,避免使用double == double或double!= double表达式。用<或>重新排列它们。可能在第10次迭代之后,c是1.00000 .. 001,而不是1.这主要是由于双重类型的内部表示。
并非所有的十进制数都可以用双浮点格式来精确表示。
在你的例子中,常数0.1是问题的根源。即使您在源代码中写入了0.1,双倍格式的下一个最佳表示也是0.1000000000000000056。
因此,比较永远不会与真实比较。
另请注意,不仅常数有问题。所有的算术(在你的情况下)也具有有限的精度问题。
Read this (Wikipedia)。打印出来,睡在枕头下几个月。
我读的地方,一些语言如Java是隐藏的精度问题。真的吗 ? – 2010-02-25 13:37:32
“隐藏”是什么意思?有些类型使用不同的内部表示形式(对于c# - 十进制),它们不会失去精度。可能在Java中有类似的类型(我认为BigDecimal很合适)。但我不确定是否可以隐藏精确问题。你可以查看这篇文章:http://discuss.joelonsoftware.com/default.asp?design.4.346343.29它解释了Java的小数点,我认为仍然是一个问题。 – anthares 2010-02-25 13:46:15