C语言,迭代法求平方根
#include<stdio.h>#include<math.h>intmain(void){doublea=0.0;doubleb=0.0;doublec=1.0;co...
#include <stdio.h>
#include <math.h>
int main(void)
{
double a=0.0;
double b=0.0;
double c=1.0;
const double e=0.00001;
printf("请输入要求开方的数:\n");
scanf("%lf",&a);
while(fabs(c-b)>e)
b=0.5*(c+a/c);
if(a<0)
printf("%lf的平方根是%.3lfi\n",a,b);
else
printf("%lf的平方根是%.3lf\n",a,b);
getchar();
getchar();
return 0;
}
这段代码只有我输入1的时候能输出答案,其他数字就没有下文了....小弟新手,求各路大神指点一二! 展开
#include <math.h>
int main(void)
{
double a=0.0;
double b=0.0;
double c=1.0;
const double e=0.00001;
printf("请输入要求开方的数:\n");
scanf("%lf",&a);
while(fabs(c-b)>e)
b=0.5*(c+a/c);
if(a<0)
printf("%lf的平方根是%.3lfi\n",a,b);
else
printf("%lf的平方根是%.3lf\n",a,b);
getchar();
getchar();
return 0;
}
这段代码只有我输入1的时候能输出答案,其他数字就没有下文了....小弟新手,求各路大神指点一二! 展开
5个回答
展开全部
你的算法用的有问题
#include <stdio.h>
#include <math.h>
int main(void)
{
double a=0.0;
double b=0.0;
double c=1.0;
double x;//----
const double e=0.00001;
printf("input num:\n");
scanf("%lf",&a);
getchar();
x=a; //负数时要进行处理
if ( a< 0 ) a=-a;
c=1,b=a;
while(fabs(c-b)>e)
{
c=b;
b=0.5*(c+a/c);
}
if(x<0)//----
printf("sqrt(%lf) = %.3lfi\n",a,b);
else
printf("sqrt(%lf) = %.3lf\n",a,b);
getchar();
return 0;
}
展开全部
三个错误:
1.不能用int型定义,用double型。
2.没有abs这么个语句,应该是fabs。
3.for循环中应该是
c=1.0/2*(b+a*1.0/b);
b=1.0/2*(c+a*1.0/c);
而不是
c=1/2*(b+a/b);
b=1/2*(c+a/c);
因为a,b,c都是实型了前面当然不能用整型。
然后再试试吧
1.不能用int型定义,用double型。
2.没有abs这么个语句,应该是fabs。
3.for循环中应该是
c=1.0/2*(b+a*1.0/b);
b=1.0/2*(c+a*1.0/c);
而不是
c=1/2*(b+a/b);
b=1/2*(c+a/c);
因为a,b,c都是实型了前面当然不能用整型。
然后再试试吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
while(fabs(c-b)>e)
b=0.5*(c+a/c);
这里的循环之后,b始终是一个值,没有对b有任何的修改,程序设计的有问题。
b=0.5*(c+a/c);
这里的循环之后,b始终是一个值,没有对b有任何的修改,程序设计的有问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为上面的算法使用的是函数f(x)=x^2-c,求根;所以要想使牛顿迭代的序列收敛于c,则,必须满足f(x0)=x0^2-c>0;所以一般情况下,取x0大于等于根号c都可以。这个是逼近理论的内容了。具体证明你查资料吧。求根好的算法很多的·给你一个快速算法:#include<stdio.h>
#include<math.h>
float SquareRootFloat(float number) {
long i;
float x, y;
const float f = 1.5F;
x = number * 0.5F;
y = number;
i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 );
y = * ( float * ) &i;
y = y * ( f - ( x * y * y ) );
y = y * ( f - ( x * y * y ) );
return number * y;
}void main()
{
float x0,x1,a;
scanf("%f",&a);
printf("%.8f",SquareRootFloat(a));}
是否可以解决您的问题?
#include<math.h>
float SquareRootFloat(float number) {
long i;
float x, y;
const float f = 1.5F;
x = number * 0.5F;
y = number;
i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 );
y = * ( float * ) &i;
y = y * ( f - ( x * y * y ) );
y = y * ( f - ( x * y * y ) );
return number * y;
}void main()
{
float x0,x1,a;
scanf("%f",&a);
printf("%.8f",SquareRootFloat(a));}
是否可以解决您的问题?
追问
不好意思,我不是需要那个算法,而是想知道这个程序错在哪里?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序写的有问题啊~~~~,while语句里边,X2的值是多少啊,在调用一个变量之前,应该先给他赋初始值的啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询