電卓サロン

負荷のかかる計算を考えてみる

電卓で難しい計算をたくさんさせて頑張らせたい。
そんなところから過去に実用で計算を使いそうな想定でボールの投げ上げや弾道計算を考えてみました。
今回は実用ではなく計算負荷かけさせることを考えてみます。

関数電卓の関数で重いやつは?

計算機で重い計算はどれか?小学生の頃、父親の(古い)関数電卓をいじっているとチカチカと電卓が計算している様が面白くて色々いじっていて、その時「69!」が一番長く考えていることを発見しました。
びっくりマークのやつがなんか長く考えているな…とおもって50!、60!、70!とやって、70!はエラー、そして61!から順にやっていくと69!が最大数だと知っていました。
今は階乗というの程度は知っていて、組み合わせとかで使うとか程度。

この階乗をたくさん使う計算は無いかな・・・・と探してみましょう。

ネイピア数

関数電卓でもある、「e」は電卓の中では多分定数で記録されているかと思いますので一瞬ででますがどうやら

こんな式らしい。∑の総和でnがある!要するにループで階乗を使う!良いね。ネイピア数自体は学生時代に使ったとは思いますが、社会人になってからは実用では使ってない…と思います。

プログラムしてみよう

結構簡単ですね
Aにxの値、これが1なら 「e」 は2.71828…….となるはず
Bはループさせるnの値にします初期値は0
Cはループを止める数、最大69ですが、60くらいに入れますか。
Mに結果をいれます初期値は0。ループ条件がMだけしか無いばあいはBとMを入れ替えですね。
昔のメモリーをkin1~6で記憶させるタイプの場合は、A,B,Cはkin1,kin2,kin3にすればいいですね。

fx-310Pでやってみる

今回はつい先日入手したfx-310にしてみます。え?先日の増えたリストにもなかったって?はいまた増えました(笑)、fx-300Pがありましたがfx-310Pも増えたのですね。
さてfx-310P、おっといきなりkin1~6のタイプですね、しかもこれはたぶん条件ループは最初に戻るタイプなので、パラメータ入力は最初にkin1,kin2,kin3,Mを設定します。

Mode 2 でプログラム入力モード、続けて計算を入力
(INV) (Kout) 1 (x^y) (INV) (Kout) 2 ÷ (INV) (Kout) 2 (INV) !(EXPキー) M+ (INV) (Kout) 2 + 1 = (INV) Kin 2 (INV) Kout 3 – Kout 2 = (INV) (x>0) (MR) (MODE) 1 (おわり)

入力して実行!RUNキーを押しますと…
計算してる計算してる!、1分13秒後に2.718281827とでてきました。これにこの電卓の1( e ^x)を出して引くと、1.3exp-09 と出ました。誤差がありますね。

多分階乗とかの変数を0からやるからで、ループの足し算は1+1+…..とやっていってどんどん小さい値を足していくのですが、これだと多分n=10とかだともうMの値に比べて小さすぎて加算値がMに入らない。60から計算すればものすごい小さい値から足していくのでより正確になるのでしょうね?変数もC(Kin3)も要りませんし、Kout3-Kout2する必要ないのでStep数も減るしヘルシー…

次はそれを考えてみましょう。

ループを逆にして精度を高める

なんか誤差1.3exp-09がちょっときになる。ループでたくさん計算させるのが目的なので、目的は達成されたとは思いますが。。。きになる。

ということで、前に出たとおりループ計算を大きい数からやっていきましょう。変数も節約できます。

Aにxの値、これが1なら 「e」 は2.71828…….となるはず
Bはループさせるnの値にします初期値は60
Cは無しでBが0になって計算を終えたら終わり。
Mは計算結果、初期値は0
Cが減りましたね。

Mode 2 でプログラム入力モード、続けて計算を入力
(INV) (Kout) 1 (x^y) (INV) (Kout) 2 ÷ (INV) (Kout) 2 (INV) !(EXPキー) M+ (INV) (Kout) 2 – 1 = (INV) Kin 2 (x>0) 1 M+ (MR) (MODE) 1 (おわり)

最後の”1 M+”は、引いて0になったらループが終わるので、0の計算をしていない。x=0の時の結果は1なので最後に1を足しています。

これをやるとfx-310Pで1分06秒、少し早くなりました。Step数少し減ったけどこんなに変わるのか?通常のStepも遅いかもですね。10秒早くなったけど減ったStepは60回しか使わないので、メモリーからだして引き算する所で1ループあたり0.167秒この単純な命令にかかっているかも?

Mに入ったデータと 1( e ^x) を引くと…0になった!
プログラム関数電卓、いいかも。
同じプログラム組んで速さとか比較してみたいですね。