查找2的平方根超过100个小数位

时间:2011-12-14 13:36:05

标签: math square-root newtons-method

我试图通过使用牛顿的方法来完成这项工作: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;
}

4 个答案:

答案 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)

当前机器上的浮点数为IEEE754,精度有限(约15位)。

如果你想要更精确,你需要bignums由({3}}

等软件库(慢慢地)提供

您还可以使用bignums以语言和实现编写程序代码。

答案 2 :(得分:2)

你根本无法用这种方法做到这一点;双打没有足够的位来获得100个精度。考虑使用库来实现任意精度,例如GMP

答案 3 :(得分:0)

这可能是因为浮点数是由计算机通过m * 10 ^ e形式近似的。由于m和e由有限数字组成,因此无法以绝对精度逼近所有数字。

想到1/3即0.333333333333333 ......