2007年7月29日日曜日

累乗根を求める

ニュートン・ラフソン法を用いて累乗根を求めるモジュール。
もちろん打ち切り誤差が発生します。// ニュートン・ラフソン法でxのn乗根を求める
#include "hspmath.as"
#module
#defcfunc radical_root double x, double n, local x_old, local x_new
    x_new = x
    repeat
        x_old = x_new
        x_new = ( n - 1.0 + x * pow@( x_old, -n ) ) * x_old / n
        if ( absf( x_old - x_new ) < 0.00000000001 ) {
            // ある程度の精度で演算を打ち切る
            break
        }
    loop
    return x_new
#global

    repeat 3
        pos cnt * 2200
        up_cnt = cnt + 2
        repeat 152
            mes strfstrcnt ) + "の" + str( up_cnt ) + "乗根は%1.10f", radical_root( cnt, up_cnt ) )
        loop
    loop
    stop


本家のBBSにあった「xの(1/n)乗がxのn乗根」という考え方を使えば、何と1行で記述できます。#define ctype radical_root( %1%2 ) expflogf%1 ) / ( %2 ) )

0 件のコメント: