福井感たっぷりなパワーワード「プログラミングの恐竜化」で期待が高まる NHKラジオ「子ども科学電話相談」のプログラミングジャンル、「わかたけ こうき」さん(小6)からの質問はこう。
算数の授業では数の平均を求める方法として数を全部足してから個数で割るって習いますが、コンピュータで計算させる時にとてもいっぱいの数とか大きな数の平均を求める時にはどうしていますか?
とても良い質問、さすがです。
番組の中で岡嶋さんが答えた方法は3つ。
- 変数の型を大きくする
- 桁を分けて計算する
- 自分であみだしてみる
(1)はプログラミング環境に依存するため わかたけ さんはさっそく (2) を検討していましたね、さすがです。
では(1)〜(3)をやってみましょう。
(2)桁を分けて計算する
10 A=14080
11 B=14060
12 C=14040
13 D=13020
20 E=A/100:F=A%100
21 G=B/100:H=B%100
22 I=C/100:J=C%100
23 K=D/100:L=D%100
30 X=(E+G+I+K)/4
31 Y=(E+G+I+K)%4
32 Z=(F+H+J+L)/4
40 ?(X*100)+(Y*100)/4+Z
「%」(あまり算)を使ってこんな感じでどうでしょう?ちょっとややこしいですね。簡単にするために、単位が m(メートル) とかなら km とかにして、端数は捨てるというのも手ですね、k(キロ)にすれば3桁少なく計算できます。
(3)自分であみだしてみる
10 A=14080
11 B=14060
12 C=14040
13 D=13020
20 ?(A+B+C+D)/4
21 ?((A+B)/2+(C+D)/2)/2
22 ?A/4+B/4+C/4+D/4
算数で習うであろう20行目の方法だと指摘の通り桁あふれでおかしな答え。でも21行目のように2つずつセットに平均を求めて、出た平均をまた2つ平均する、とやっていけばうまく行きます。ただし「2つを足した時には桁あふれしない」という前提が要りますし、データの個数が 2のn乗個 でない時は何か工夫する必要があります(半端分の個数は捨てちゃうとか無理やり個数増やすとか)。22行目は各数値をデータ個数で割ってから足していきます、これでも出ますね。
(1)変数の型を大きくする
わかたけ さん、番組では「BASICを使っていて、1億も扱えない仕様」と言っていました。
PCNプロコンで「優秀賞」をゲットした「イチゴーグ」の 若竹康輝 さん ですよね?
「イチゴーグ」はソースコードも含め、最高の作品でした。先月はシリコンバレーにも持って行って MakerFaire Bay Area 2019 で展示してきましたよ。
さて、IchigoJamボードをお持ちなら IchigoLatte JavaScript に焼き変えることも手です(秋葉原Assemblageに持って行っても焼き変え可能)。Latte JS の整数は 2,147,483,648 まで扱えます。扱いたいデータの合計がこの範囲ならこれで楽できます。
ですが、もっと大きな数になる時にはもっと大きな変数が欲しくなりますし、もっともっと大きな数になる時にはやはり(2)や(3)の方法になるでしょう。(マシン語を使えば(2)の方法を簡単にしてくれるかも?)
聞き逃した方はこちら、1:30ぐらいからどうぞ。プログラミングの恐竜化(36:00あたり)、楽しみですね!
理論や理想だけではうまくいかないのが現実、そこと向き合うのがこの宇宙。
若竹さん、今年もクレイジーな作品、待ってるよ!
.