ルートの計算
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
仕組み
特に説明するほどでもないか。