サイトマップ / C言語講座出入り口総目次目次:数学の関数>立方根を求める関数

青い直線

立方根を求める関数

青い直線

[問題解決について]←このソース→[ポインタの型と初期化]

/* 標準ライブラリ関数 sqrt( )はdouble型のデータを引数とし、その平方根(Square Root)を返します。

	#include <math.h>
	double sqrt(double x);
	例:sqr = sqrt(x);
	
	xの値		戻り値
	0以上		平方根
	負		0 ( errno に EDOM がセットされる )
math.hをインクルードして、

	double x, sqr;
	sqr = sqrt(x);

のように使用します。

ソースプログラムの説明

立方根Cubic Root)を求めるライブラリ関数はありません。今回は精度を8桁として立方根を返す関数GetCbRoot( )を作ります。

Xの立方根を求めるアルゴリズムについて説明します。

Xが0なら立方根は0(関数から抜ける)

Xの平方根stvはXの立方根の絶対値とXの絶対値の間の値になります。

	X の立方根の絶対値 < X の平方根 stv < X の絶対値

そこで、立方根の初期値をstvとします。stv の符号をXと同じにします。この部分をGetStartValue( )という関数にしました。dxを精度として初期値をstvの1/10に設定します。

X > stv の3乗 なら
	X < stv の3乗になるまで、stv に dx を加える		
	X < stv の3乗になったら、dx に -1/10をかける
	dx の絶対値が、0.00000001 より小さければ関数から抜ける
	そうでなければ、下のループへ行く
X < stv の3乗 なら
	X > stv の3乗になるまで、stv からdxを引く
	X > stv の3乗になったら、dx に -1/10をかける
	上のループへ行く

実際のソースプログラムでは、上の二つのループを一ヶ所にまとめています。実行すると立方根の真の値付近を、stvは幅を縮めながら増減を繰り返し、真の値に近づいていきます。これを無限回繰り返せば無限に正確な立方根が求められるはずです。しかし、無限に時間がかかります。そこで、今回は小数点以下8桁までとしました。

ソースプログラムの中に、まだ紹介していないライブラリ関数があります。

	#include <math.h>
	double fabs(double x);
	
	例:q = fabs(double x);
	
	実行結果	戻り値
	成功		x の絶対値

*/

/* ここからソースプログラム */

#include <stdio.h>
#include <math.h>    /* sqrt(  ) と fabs(  ) で必要 */

double GetStartValue(double x);
double GetCbRoot(double x, double stv);
void main(void);

  /* 立方根の初期値を求める */
double GetStartValue(double x)
{
    if (x >= 0)        /* x が正なら平方根を返す */
        return (sqrt(x));
    if (x < 0)      /* x が負なら絶対値の平方根 */
        return (-sqrt(-x));    /* に-を付けて返す */
} 

  /* 立方根を求める */
double GetCbRoot(double x, double stv)
{
    double dx = stv / 10;
	
    if (x == 0.0)        /* x が0なら平方根も0 */
        return (0.0);

    if (x < stv * stv * stv)
        dx *= -1.0;

    while (1) {    /* 2重の無限ループ */
        while (1) {
            if (( dx > 0 && (x < stv * stv * stv)) || 
                (dx < 0 && (x > stv * stv * stv))) 
                              /* 立方根と近似値の大小関係が変化したら */
                break;        /* 内側の無限ループから抜ける */
            else
                stv += dx;
        }
        if (fabs(dx) < 0.00000001)
                      /* 小数点以下8桁まで精度が出たら */
            break;    /* 外側の無限ループから抜ける */
        else          /* まだならここ */
            dx *= -0.1;
    }
    return (stv);
}

void main(void)
{
    double x;          /* この立方根を求める */
    double stv;        /* 立方根の初期値 */
    double cbr;        /* 立方根 */

    printf("数字を入力\t");
    scanf("%lf", &x);

    stv = GetStartValue(x);        /* 立方根の初期値を求める */
    cbr = GetCbRoot(x, stv);       /* 立方根を求める */

    printf("%lf の立方根は %12.8lf\n\n", x, cbr);

}

/* ここまでソースプログラム */

/* 今回のプログラムは、結局は下記に示す3次方程式を近似的に解いたことになります。

    cbr * cbr * cbr - x = 0

*/

[問題解決について]←このソース→[ポインタの型と初期化]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:数学の関数>立方根を求める関数