平方根

計算により与えられた数の平方根を求めるプログラムです。

平方根(list_20.c)
/*-------------------------------------------------------
  Program to obtain square root of a given number
  -------------------------------------------------------*/
#include <stdio.h>
#include <math.h>

#define TOL 5.0e-7 /* 許容誤差 */
#define MAX 40     /* 最大反復計算回数 */
#define SOLVED  0  /* STATUS 変数 */
#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;
}

/***************************************************
 * Function to obtain square root                  *
 ***************************************************/
double SqRoot(double y,double x,int* state)
/*
  y: 平方根を求める値
  x: 平方根の初期近似値
 */
{
    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);
}
実行結果
Gami[1094]% list_20.exe
demanding root value: 3
init value: 1
  >Sqroot, No. of iter.=1 x=2.000000
  >Sqroot, No. of iter.=2 x=1.750000
  >Sqroot, No. of iter.=3 x=1.732143
  >Sqroot, No. of iter.=4 x=1.732051
  >Sqroot, No. of iter.=5 x=1.732051
root = 1.732051
Gami[1095]%
inserted by FC2 system