我试图让一个双数约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;
}
确定后,我读了一些东西ü张贴我在想我怎么会从我的电话号码删除这个多余的东西,以保持稳定的乘法。 例如,在我的例子。 我的小数部分会以这种方式chaning: 0.3,0.6,0.2,0.4,0.8...
我们可以降低其余保持这个数字?
与典型的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;
}
在一般情况下,浮点运算是不完全准确的,如在其他的答案,在许多网上资源。 问题是,某些号码可以不完全以二进制来表示。 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;
}
虽然你的程序是做一些很不同寻常的事情,主要回答你的问题是,这是点数如何浮动工作。 他们是不精确的。
http://floating-point-gui.de/basic/