用迭代法求a的立方根,最后运行有点小问题
一下我我码出来的代码:#include <stdio.h>
#include <math.h>
int main()
{
printf("a=");
float x0,x1=1,a;
scanf("%f",&a);
x0=a;
do
{
x1=2*x0/3+a*2/(3*x0*x0);
x0=x1;
}while(fabs(x1-x0)>=0.00001);
printf("a的立方根为:%.3f",x1);
return 0;
}
然而运行出来却算不对数,按理来说8的立方根不是应该是2吗?
while循环的判定条件不对,应该是
fabs(a - x0 * x0 * x0)>=0.00001 你的迭代公式不对!
你试试 x1=x0+0.5*a/x0-0.5*x0*x0
这是牛顿迭代公式推出来的。
砚堂_ 发表于 2017-11-5 20:38
你的迭代公式不对!
你试试 x1=x0+0.5*a/x0-0.5*x0*x0
这是牛顿迭代公式推出来的。
还是不行,算出来甚至是负数{:9_220:} BngThea 发表于 2017-11-5 16:16
while循环的判定条件不对,应该是
fabs(a - x0 * x0 * x0)>=0.00001
谢谢!我的迭代公式也有错,然后我根据百科里面公式推导出x1=x0-3*pow(a,-1/3)然后成功运行出8的立方根是2,但是我换输入0.0001的时候就无法求出立方根是0.1{:9_220:} 砚堂_ 发表于 2017-11-5 20:38
你的迭代公式不对!
你试试 x1=x0+0.5*a/x0-0.5*x0*x0
这是牛顿迭代公式推出来的。
还是谢谢你的提醒,我那个公式是在贴吧找的,老师给的练习题没有公式,然后我根据你的话去查百科了,看到里面有一个推导公式,然后我自己推导出来了。还是很谢谢你{:9_232:} Napo鱼 发表于 2017-11-5 21:33
谢谢!我的迭代公式也有错,然后我根据百科里面公式推导出x1=x0-3*pow(a,-1/3)然后成功运行出8的立方根是 ...
我没仔细看你的迭代公式,以为没问题的。。。
{:10_266:} BngThea 发表于 2017-11-5 21:37
我没仔细看你的迭代公式,以为没问题的。。。
那你可以帮我再看看为什么小数的立方根求不出来无法运行{:10_266:} Napo鱼 发表于 2017-11-5 21:39
那你可以帮我再看看为什么小数的立方根求不出来无法运行
你上面的说0.0001的立方根本来就不等于0.1
0.001的才为0.1
你先试试 0.125的是否为0.5 或者 0.008的是否为0.2 BngThea 发表于 2017-11-5 21:43
你上面的说0.0001的立方根本来就不等于0.1
0.001的才为0.1
你先试试 0.125的是否为0.5 或者 0.008的是 ...
程序无法运行,表示enter键要被我按坏了{:10_266:} Napo鱼 发表于 2017-11-5 21:46
程序无法运行,表示enter键要被我按坏了
{:10_277:} BngThea 发表于 2017-11-5 21:50
貌似是0.001等不符合循环条件一直在死循环{:10_266:}我还试了0等一些整数也不能{:10_245:} 好奇怪哦。我回去给你发我写的代码吧!我那个能运行。 噗,突然发现一个问题,你循环体里面两个式子顺序不对,导致x0==x1是恒成立的,你的迭代式只能完成一次迭代,所以除非运气好一次就算出来,否则不可能得到正确结果。
你把里面两个式子换个位置试试!
页:
[1]