Newton Raphson for Cube Root(双精度误差)

时间:2013-12-29 11:30:44

标签: c++ floating-point double

我正在尝试用C ++实现Newton Raphson。

方法:          在我的root()函数中,即使while(temp-e>0),我的temp==e也存在。我知道这是因为使用双打并且比较double可能会产生精度错误。但我仍然想知道如何才能确保循环仅在temp==0时存在。测试用例64出错。我的代码返回4.000001,而它应返回4.000000。 请帮帮....

CODE:

#include<stdio.h>
double root(int n)
{
       double x=n,a,b,e=0.000001,temp;
       a=2*x;
       b=n/(x*x);
       temp=1;
       while(temp-e>0)
       {
                 x=(a+b)/3;
                 a=2*x;
                 b=n/(x*x);
                 temp=(n/(x*x)-x)/3;
                 temp=temp<0?-temp:temp;
       }
       return x;
}

int main()
{
    printf("%lf\n",root(64));
    return 0;
}

虽然这段代码给出了正确的答案,但我在temp开始失败的情况下进行了两次迭代:

#include<stdio.h>
double root(int n)
{
       double x=n,a,b,e=0.000001,temp;
       a=2*x;
       b=n/(x*x); 
       int i=0;
       temp=1;
       while(i<=2)
       {
                 x=(a+b)/3;
                 a=2*x;
                 b=n/(x*x);
                 temp=(n/(x*x)-x)/3;
                 temp=temp<0?-temp:temp;
                 if(temp<e)
                           i++;
       }
       return x;
}
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
              scanf("%d",&n);
              printf("%lf\n",root(n));
    }
    return 0;
}

0 个答案:

没有答案