「√2 の話:その27 古いBASICインタープリタ
★奥村さんの「C言語による 最新 アルゴリズム事典」の記述です。
古いBASICインタープリタでは√xを exp((1/2)ln(x))として求めていたことがあったが、これでは遅いうえに誤差のために平方数の平方根が整数にならない。
これね、単に平方根だけなら、古いBASICだってニュートン法でやってもいいとして、「n乗根」というようなことになると、自然対数をとって、nで割って、eの肩に乗っけてやる、というのはシンプルでいいのですよね。
プログラムをお目にかけます。今回は十進BASICです。
----------------------------------------
!n乗根
DECLARE EXTERNAL FUNCTION NthRoot
LET n = 2 !n乗根
FOR i = 1 TO 10
PRINT i;
PRINT NthRoot(i, n)
NEXT i
END
EXTERNAL FUNCTION NthRoot(m, n)
LET NthRoot = EXP((1/n)*LOG(m))
END FUNCTION
----------------------------------------
1 1
2 1.4142135623731
3 1.73205080756888
4 2
5 2.23606797749979
6 2.44948974278318
7 2.64575131106459
8 2.82842712474619
9 3
10 3.16227766016838
・3.1622776601683793319988935444327
----------------------------------------
n=3
1 1
2 1.25992104989487
3 1.44224957030741
4 1.5874010519682
5 1.7099759466767
6 1.81712059283214
7 1.91293118277239
8 2
9 2.0800838230519
10 2.15443469003188
・2.1544346900318837217592935665194
----------------------------------------
n=5
1 1
2 1.14869835499704
3 1.24573093961552
4 1.31950791077289
5 1.37972966146121
6 1.43096908110526
7 1.47577316159455
8 1.5157165665104
9 1.55184557391536
10 1.58489319246111
・1.5848931924611134852021013733915
----------------------------------------
「・」のついているのはウィンドウズの関数電卓で求めた値です。比較のため。
今のパソコンのCPUは64ビットだもんなぁ。精度は充分に高いし、√9も、3乗根8、もちゃんと整数になっています。
表示桁より先まで計算していて、表示用に四捨五入かなんかしてるのですよ。
n乗根だけではなく、有理数乗根(m/n 乗根)にも簡単に対応できるし、現在は、実用的に使えるアルゴリズムだと思いますね。
ちなみに、私の座左の古い電卓だと{座右にはマウスがありますので}
exp((1/3)ln(8))=7.999999999 になります。
でも(1/3)*3=1 です。
(1/3)*3 が1にならない電卓もありましたよね。
「理科おじさん」カテゴリの記事
- 化学の日(2022.10.26)
- 秒速→時速(2022.09.01)
- 風速75メートル(2022.08.31)
- 「ウクライナで生まれた科学者たち」(2022.05.31)
- 反射光(2022.05.09)
コメント