我无法在这个简单的代码错误中进行这种比较..我正在做什么,原因是什么? ...
#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");
}
答案 0 :(得分:3)
将其设为while ( a <= b )
使用double(和数据类型本身)的操作存在精度问题。所以,避免使用double == double或double!= double表达式。用&lt;重新排列它们。或者&gt;。可能在第10次迭代之后,c是1.00000 .. 001,而不仅仅是1.这主要是由于双重类型的内部表示。
答案 1 :(得分:1)
并非所有十进制数都可以使用双浮点格式精确表示。
在您的示例中,常量0.1是问题的根。即使你在源代码中写了0.1,双格式的下一个最佳表示是0.1000000000000000056。
因此,比较永远不会与真实比较。
另请注意,不仅常量有问题。所有算术(在你的情况下都是加法)也有限的精度问题。
答案 2 :(得分:1)
Read this (Wikipedia)。打印出来,在枕头下睡几个月。
答案 3 :(得分:1)