我正在尝试用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;
}