使用双倍数据速率简单比较数据

时间:2010-02-25 13:15:40

标签: c types

我无法在这个简单的代码错误中进行这种比较..我正在做什么,原因是什么? ...

#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");
}

4 个答案:

答案 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)