
二分法求平方根 C语言
3个回答
展开全部
这应该是算法的伪代码,至少可以肯定,这不是C语言的代码,C语言里就没有<-这种语法。
二分法求解的方法,就是拿一个可能的结果,去试验、比较,看结果大还是小了,二分结果的区间,重复,直到得到满足精copy度要求的结果。
比如要求解2的平方根,x=2,给定区间[0,10],a=0,b=10。
第一次循zhidao环,c给定中点值5,5把区间[0,10]二分成两部分。试算5的平方,结果非小于x,可知最终的结果在[0,5),不是在(5,10],求解区间变成[0,5]
第二次循环,c给定中值2.5,然后循环重复,直到done=1或者c==c_old,即找到一个c的平方正好完成等于x即找到一个正好结果,或者两次计算结果完成一致的数,这个数的精度已经很高,划分的区间足够小,不能再分了,循环完成,得到结果c。
二分法求解的方法,就是拿一个可能的结果,去试验、比较,看结果大还是小了,二分结果的区间,重复,直到得到满足精copy度要求的结果。
比如要求解2的平方根,x=2,给定区间[0,10],a=0,b=10。
第一次循zhidao环,c给定中点值5,5把区间[0,10]二分成两部分。试算5的平方,结果非小于x,可知最终的结果在[0,5),不是在(5,10],求解区间变成[0,5]
第二次循环,c给定中值2.5,然后循环重复,直到done=1或者c==c_old,即找到一个c的平方正好完成等于x即找到一个正好结果,或者两次计算结果完成一致的数,这个数的精度已经很高,划分的区间足够小,不能再分了,循环完成,得到结果c。
展开全部
#include
<stdio.h>
void
main()
{
float
x0,x1,x2,fx0,fx1,fx2;
do{
printf("enter
x1
&
x2:");
scanf("%f,%f",&x1,&x2);
fx1=(x1*(2*x1-4)+3)*x1-6;
fx2=(x2*(2*x2-4)+3)*x2-6;
}while(fx1*fx2>0);
/*如果f(x1),f(x2)同号,则在[x1,x2]区间无实根,重新输入x1,x2
*/
do{
x0=(x1+x2)/2;
/*求x1和x2间的中点:x0=(x1+x2)/2
*/
fx0=(x0*(2*x0-4)+3)*x0-6;
if((fx0*fx1)<0){ /*如f(x0)与f(x1)不同号,把x0赋给x2,把f(x0)赋给f(x2)*/
x2=x0;
fx2=fx0;
}
else{ /*否则,把x0赋给x1,f(x0)赋给f(x1)*/
x1=x0;
fx1=fx0;
}
}while(fabs(fx0)>=1e-5);/*判断f(x0)的绝对值是否小于某一个指定的值(如10的负5次方)*/
printf("x=%6.3f\n",x0);
/*输出x0*/
}
<stdio.h>
void
main()
{
float
x0,x1,x2,fx0,fx1,fx2;
do{
printf("enter
x1
&
x2:");
scanf("%f,%f",&x1,&x2);
fx1=(x1*(2*x1-4)+3)*x1-6;
fx2=(x2*(2*x2-4)+3)*x2-6;
}while(fx1*fx2>0);
/*如果f(x1),f(x2)同号,则在[x1,x2]区间无实根,重新输入x1,x2
*/
do{
x0=(x1+x2)/2;
/*求x1和x2间的中点:x0=(x1+x2)/2
*/
fx0=(x0*(2*x0-4)+3)*x0-6;
if((fx0*fx1)<0){ /*如f(x0)与f(x1)不同号,把x0赋给x2,把f(x0)赋给f(x2)*/
x2=x0;
fx2=fx0;
}
else{ /*否则,把x0赋给x1,f(x0)赋给f(x1)*/
x1=x0;
fx1=fx0;
}
}while(fabs(fx0)>=1e-5);/*判断f(x0)的绝对值是否小于某一个指定的值(如10的负5次方)*/
printf("x=%6.3f\n",x0);
/*输出x0*/
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在给定的区间单调,对应的函数就可以zd用二分法计算根。平方根函数符合这个条件,当然可以用二分法求解。
上述程序片段是一段伪代码,<-
表示赋值。
done=1代表根已求出。
a,b代表求根的区间,初始值a=0,b=一个比可能值要内大的数,题目中举例说2的16次方,其实只要取x就足够了。
c代表当前假定的根。
do循环就是一个二分的过程,直到done=1或者c=c_old结束。
在实际使用时,
if
(c*c
==
x)及
(c
!=
c_old)都应该改成判断两个数的差是否小于给定容的误差限,否则实数的相等比较会出现判断错误的。
上述程序片段是一段伪代码,<-
表示赋值。
done=1代表根已求出。
a,b代表求根的区间,初始值a=0,b=一个比可能值要内大的数,题目中举例说2的16次方,其实只要取x就足够了。
c代表当前假定的根。
do循环就是一个二分的过程,直到done=1或者c=c_old结束。
在实际使用时,
if
(c*c
==
x)及
(c
!=
c_old)都应该改成判断两个数的差是否小于给定容的误差限,否则实数的相等比较会出现判断错误的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |