#include
#include
#define TOL 5.0e-7
#define MAX 40
#define SOLVED 0
#define LIMITED 1
#define OVFLOW 2
#define NUMBER 125.0
#define XINIT 1.0
double SqRoot(double ,double ,int * );
int main()
{
int status;
double x,y,root;
printf("demanding root value: ");scanf("%lf",&y);
printf("init value: ");scanf("%lf",&x);
root = SqRoot(y,x,&status);
if(status == SOLVED) printf("root = %lf\n",root);
return 0;
}
double SqRoot(double y,double x,int* state)
{
int i=0,flag=1,status;
double newx,oldx;
double Tiny=1.0e-10;
if(x<Tiny){
status = OVFLOW;
flag = 0;
}
oldx = x;
while(flag){
i++;
newx = 0.5*(oldx + y/oldx);
printf(" >Sqroot, No. of iter.=%d x=%lf\n",i,newx);
if(fabs(newx-oldx) <= TOL){
status = SOLVED;
flag = 0;
}
oldx = newx;
if(i >= MAX){
status = LIMITED;
flag = 0;
}
}
if(status == OVFLOW)
printf(" >Sqroot, Illegar data input for x\n");
if(status == LIMITED)
printf(" >Sqroot, not converged after %d, Current value is %lf\n",i,oldx);
*state = status;
return(newx);
}
|