ルートの計算

sqrt(平方根)の計算 - 永字八法の続き。
「次は立方根だ!」と思ったが、もっとよく考えたら、「n乗根を求める命令」を作った方がいいんじゃないか、と思って作ってみた。

使い方

root %result,%num,%mul

第一引数には結果を格納する数値変数を、第二引数には平方根を求めたい数値を入れる。追加された第三引数には、2以上の数値を入れる。2にするとsqrt(平方根)と同じ意味になる。立方根が欲しければ3にする。
得られる結果は、端数切り捨てになった数値である。1000倍した結果が欲しければ、元の数値を1000000倍してからやってくださいな。(ただし、それであんまり大きな数値を指定すると、NScripterが扱えなくなってエラーになるけど)
もし、第二引数に0やマイナスの数値を指定すると、0が返される。第三引数に2未満の数値を入れても同様。

スクリプト

define節、game命令以上
mov %0,100 ; 適宜変更すること。
numalias root_base,%0:inc %0
numalias root_result,%0:inc %0
numalias root_try,%0:inc %0
numalias root_temp,%0:inc %0
numalias root_temp2,%0:inc %0
numalias root_num,%0:inc %0
numalias root_loop,%0:inc %0
numalias root_flag,%0:inc %0
defsub root
game命令以下、start節以上
*root
getparam i%root_result,%root_base,%root_num
mov %%root_result,0 ; 初期化
if %root_num<2 return ; 二乗以上でないと受け付けませんわ。
if %root_base<1 return ; 0とかマイナスの数値はよう扱わんわ。
if %root_base=1 mov %%root_result,1:return ; 1なら1だよな。ショートカット
mov %root_try,1
mul %root_try,2
if %root_try<%root_base skip -1
div %root_try,2
~
mov %root_flag,0
mov %root_temp,%%root_result+%root_try
mov %root_temp2,1
for %root_loop=1 to %root_num
	mul %root_temp2,%root_temp
	if %root_temp2>%root_base inc %root_flag:break
next
if %root_flag=1 skip 3
notif %root_temp2>%root_base add %%root_result,%root_try
if %root_temp2=%root_base return ; ショートカット
if %root_try=1 return
div %root_try,2
jumpb

仕組み

特に説明するほどでもないか。