我试图获得双倍数的多重小数部分约500次。随着时间的推移,这个数字开始失去精确度。是否有任何技巧可以使连续乘法准确?
double x = 0.3;
double binary = 2.0;
for (i=0; i<500; i++){
x = x * binary;
printf("x equals to : %f",x);
if(x>=1.0)
x = x - 1;
}
好的,在我阅读了你发布的一些内容后,我在想如何从我的号码中删除这些不需要的东西,以保持乘法稳定。例如在我的例子中。我的小数部分将以这种方式进行处理:0.3,0.6,0.2,0.4,0.8...
我们可以削减其余部分以保留这些数字吗?
答案 0 :(得分:2)
通常,浮点数学并不完全精确,如其他答案和许多在线资源所示。问题是某些数字不能用二进制表示。 0.3
是这样的数字,但所有自然数都不是。所以你可以改变你的程序:
double x = 3.0;
double binary = 2.0;
for (i=0; i<500; i++){
x = x * binary;
printf("x equals to : %f",x/10.0);
if(x>=10.0)
x = x - 10.0;
}
答案 1 :(得分:2)
典型的FP为binary64,double x = 0.3;
会产生x
,其值更像0.29999999999999998890...
,因此代码与开头有差异。
将x
缩放10以保持精确数学 - 或使用decimal64 double
int main(void) {
double x = 3.0;
double binary = 2.0;
printf("x equals to : %.20f\n",x);
for (int i=0; i<500; i++){
x = x * binary;
printf("x equals to : %.20f\n",x/10);
if(x>=10.0)
x = x - 10;
}
return 0;
}
答案 2 :(得分:1)
虽然你的程序正在做一些非常不寻常的事情,但问题的主要答案是这就是浮点数的工作原理。它们不精确。