「やあ行き倒れだよ。週刊少年サンデーの電波教師2期がぶっちぎりに面白くて大満足。あーゆー先生と私も昔出会えたらなー。まあ良くしてくれた先生もいたけどさ。」
「こっちは授業が退屈で、つい電卓で遊んでしまうわ。」
「おいおい・・・」
「気持ちはわからんでもない。私も勉強は嫌いだった。算数や数学、英語、社会が苦手でな、体育なんて鬱だった。しかし今の子はいいなー。電卓使えるわ、国語の朗読は電子黒板がやってくれるわ、私ゃ朗読させられる際に声で笑われるから自分の声が大嫌いで喉を掻っ切ってしまいたい気分に何度もなったわ当時。」
「まあ暗い話はそのへんにしましょうよ。今は良い時計も付けて満足でしょ。」
「まあ、ね。子供のころのなんか凄そうな機械をいじる仕事をしたいも叶ってるし。で、えりかさんは電卓でどんな遊びを?」
「1++としたあと、=キーを連射は基本だよね!」
「確かにな。」
「あとは、1×2×3というように延々掛けたり。途中でエラーになって止まっちゃうけど。」
あまり大きい数字になるとこんな風にエラーになってしまいますね
「確かに、電卓には限界がありますね。」
「スーパーコンピューターの京とかならこの先の掛け算も出来るのかねえ、と思うわけよ。」
「昔の私もそう考えてた時期あったなー。今回はこれを題材にしようか。X68エミュレータ上でX−BASICでプログラムを書いてみよう。」
1×2×3×4のような動きをプログラムにするにはどうすればいいか考えます
分解して考えると
1×1=1
1×2=2
2×3=6
6×4=24
求めた答えを次に繰り越すようにして掛け算をしていけばいいことになります
掛けられる数 × 掛ける数と見ると、掛ける数は計算させる回数と同期させていいことに気付きます
これをプログラムにします
無事動きました
これは1×2×3×4×5×6×7×8×9×10まで計算させています
「わりと簡単なもんなんですね。変数kazuに入れた回数だけ掛け算を繰り返すんですね。」
「国語的解釈すればいい場面ではマジ強いなつぼみん。」
「それより先の数が見たい。あくしろや。」
計算途中でオーバーフロー(桁あふれ)になったようです
「電卓以下っすか。」
「いやそんなはずは・・・あ、答えが入る変数ansの型がint型じゃねーか。すまんかった。大きな数を扱える浮動小数点型にせんとダメだった。float型に変更しよう。」
479001600×13を計算しようとしてエラーになったようです
整数を扱うint型では2147483647までしか表現出来ません
もっと大きな数値扱える浮動小数点型(実数型)として扱うように変更します
これでよし
動きました!
「出たけど、途中からなんか化けましたね。」
「電卓では確かに見られない世界を見ることは出来たけど、なんじゃいこれ。」
「14桁以上のある程度以上の数値になるとこんなふうに短縮されて表示されるようになるのよ。大きな数値だからの他にも理由はあるんだが、それはいずれ話そう。」
「スーパーコンピューターなら解けるのかなーこういう問題。」
「こうしてみるとコンピュータに内蔵されている計算機は意外と限界低いことがわかるね。」
「観念して人間の手で計算したら?小学生の算数レベルでしょ計算自体は。」
「妙案ね。」
(人間の手かよ・・・)
「計算機に別のやり方の基本の計算方法があるよと教えてやればいいわけだね。」
「何を言ってるんだね君は。」
「そういう手がありましたか。」
「プログラムには大きく分けて2種類ある。ひとつはコンピュータの仕様の範囲内で動かすプログラム、もうひとつが人間の知恵でそのままの仕様では出来ないこともあたかも出来るように見せてるプログラムだ。」
「こういう場合、元となるものがどういうものなのかを分析する必要がある。人間のやっていることや動物のやっていることをプログラムやロボットの動作に置き換える、または組み込むことを生態模写と言う。最先端の考え方だよ。」
小学生の時に習う掛け算を改めて分析すると・・・意外と高度ですねコレ
「やること大幅に増えましたよ!?」
「ずらすってのはそういう意味だったの!?」
「数値と数字の違いは何。」
「数値はそれ自体が価値を持っていて人間の脳内で直接計算するのにイメージ出来るもので、数字は文字通り文字で記号とも言え、紙などに書かれている状態で、その記号がなんなのかという意味を教えられていない限りはなにもわからないというものと認識してますがいかがでしょう。」
「つぼみんが真っ白になるくらい完璧な答えでしたわ。コンピュータはもちろん文字も扱える。」
整数型のintでは大きな数値を入れようとすると入りきらずエラーを出してきます
実数型のfloatでは大きな数も扱えますが、あまり大きいと省略形にされてしまいます
ところが文字型であるstrなら紙に書いてある数字と同じような扱いになり、このように大きな桁の数字もそのままコンピュータに覚えさせることが出来ます
しかし文字型だとこのように計算が出来ません
足し算すると相手の文字とくっつくだけです
大小比較も当然出来ません
改めて掛け算を見てみましょう
「人間が紙に書かれている1+1を見て計算するまでの流れを考えてみよう。」
紙に書かれている「1+1」を見る
↓
目から入った情報は脳内に入る
↓
記号の意味を解釈する
記号は2種類あるので分解して解釈する
「1」という文字は1の事であると学習した経験から理解する
「+」は足し算することであると学習した経験から理解する
↓
1+1を計算する
↓
2という答えを紙に書くために学習した経験から「2」という記号イメージに結びつける
↓
そのイメージを紙に出力するために手に伝える
↓
紙に「2」と書く
「人間ってすげーな。」
「これと似たようなことをコンピュータにさせようと!?」
「そういうことよ。数値を数字にしてコンピュータに覚えさせ、数字を数値に1桁ずつ分解して計算させ、1桁ずつ答えを数字として書き込んでいく。計算が終わると極大数字同士の計算が出来ているという方法。文字列処理を応用するんだ。」
「物凄く計算量増えるからコンピュータの利点である、人間をはるかに超える計算速度のメリットが大幅に落ちますよねこれ。」
「それでも人間よりはるかに速い。凄まじい計算速度はむしろそうやって使うもんなんだよ。」
「小学校で習う計算方法を、計算機に教える、ですか・・・。そんな方法で計算機の限界を超えることが本当に出来るんですか・・・!?」
「出来るよ。出来たからシーズン2を始めたんだ。」
「あらゆる応用は基本から、なんだぜ?コンピュータは2進数という数学的方法で計算しているが、コンピュータの中に入っている計算機には限界がある。その限界を算数が塗り替える。その事実を数回に渡りお伝えしたい。」
「あれ、でも以前、何かやっていませんでしたっけ?」
「極大数字同士の足し算はやっているね。サブプログラムであるlarge_scale_add関数の開発を昔やっておいて正解だった。largeは面積に対しての言い方だとわかったので、今はbig_scale_add関数と呼んでいるし、処理のさせ方ももう少し最適化されているよ。」
http://mixi.jp/view_diary.pl?id=1928766983&owner_id=4556571
「次回に続く」
ログインしてコメントを確認・投稿する