我试图通过使用牛顿的方法来完成这项工作:wiki使用以下代码,但问题是它只提供精确的结果,最多16位小数。我试图增加迭代次数,结果仍然相同。我从1的初始猜测开始。那么我怎样才能提高答案的准确性(小数达到100或更多)? 谢谢。 代码:
double x0,x1;
#define n 2
double f(double x0)
{
return ((x0*x0)-n);
}
double firstDerv(double x0)
{
return 2.0*x0;
}
int main()
{
x0 = n/2.0;
int i;
for(i=0;i<40000;i++)
{
x1=x0-(f(x0)/((firstDerv(x0))));
x0=x1;
}
printf("%.100lf\n",x1);
return 0;
}
答案 0 :(得分:4)
要解决精度浮点数有限的问题,您也可以使用牛顿方法 在每次迭代中找到一个理性(a / b,a和b整数),它是sqr(2)的更好近似值。
如果x = a / b是您上次迭代返回的值,那么牛顿方法表明新估计y = c / d为:
y = x / 2 + 1 / x = a / 2b + b / a =(a ^ 2 + 2b ^ 2)(2ab)
这样:
c = a ^ 2 + 2b ^ 2
d = 2ab
精确度每次迭代加倍。你仍然可以达到的精度有限,因为提名者和分母很快就会增加,但是找到大整数的实现(或者自己编造一个)比找到任意精度浮点的实现更容易。此外,如果你真的对小数感兴趣,那么这个答案对你没有帮助。它确实为您提供了非常精确的sqr(2)估计值。
算法的一些a / b迭代:
1 / 1,3 / 2,17 / 12,577 / 408,665857 / 470832。
665857/470832近似sqr(2),误差为1.59e-12。错误将保持为1 / a ^ 2的顺序,因此实现a和b作为long将给出精度1e-37 -ish。
答案 1 :(得分:2)
答案 2 :(得分:2)
你根本无法用这种方法做到这一点;双打没有足够的位来获得100个精度。考虑使用库来实现任意精度,例如GMP。
答案 3 :(得分:0)
这可能是因为浮点数是由计算机通过m * 10 ^ e形式近似的。由于m和e由有限数字组成,因此无法以绝对精度逼近所有数字。
想到1/3即0.333333333333333 ......