我已经读过一些机器无法表达例如1.1的exaclty浮点数 我们拿代码
float x=0.1;
do{
x+=0.1;
printf("%f\n",x);
} while(x!=1.1);
这段代码从未完成如何让代码完成?也许将其转换为双倍或?
答案 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_problems和http://en.wikipedia.org/wiki/Decimal_floating_point