浮点运算

时间:2010-07-30 13:14:08

标签: algorithm

我已经读过一些机器无法表达例如1.1的exaclty浮点数 我们拿代码

float x=0.1;
do{

x+=0.1;
printf("%f\n",x);
} while(x!=1.1); 

这段代码从未完成如何让代码完成?也许将其转换为双倍或?

5 个答案:

答案 0 :(得分:3)

对于数值问题,通常指定精度的epsilon:

bool within_epsilon(float x, float y, float e) {
    if (abs(x - y) > e) {
        return false
    } else {
        return true
    }
}

您选择的epsilon将改变您的准确性,您可以选择的epsilon取决于您的浮点实现:Machine epsilon

答案 1 :(得分:2)

例如,在可接受的范围内进行比较。即

while (abs(x-1.1)>0.001);

双打将有同样的问题,只是更精确。有些语言也为您提供合理的类型,您可以在其中指定数字作为分数1/10或定点数据类型。

答案 2 :(得分:0)

在这种情况下,请检查“<”会做的伎俩:

float x=0.1;
do{

x+=0.1;
printf("%f\n",x);
} while(x<1.05); 

一般来说,你应该测试一个“epsilon”。查看here以获取更多信息。

答案 3 :(得分:0)

在固定点工作,为此类任务。

例如decimal类型可能有所帮助。但它不是所有问题的解决方案。

答案 4 :(得分:-1)

如果你想像你所说的那样准确地执行代码,那么你想要使用像十进制(如果可用)这样的类型,这是一个基本的10浮点实现而不是基数2.

进一步阅读:http://en.wikipedia.org/wiki/Floating_point#Accuracy_problemshttp://en.wikipedia.org/wiki/Decimal_floating_point