mixiユーザー(id:4556571)

2015年04月29日17:59

188 view

[X68]プログラムのかきかたシーズン2 その1[X−BASIC]

フォト

「やあ行き倒れだよ。週刊少年サンデーの電波教師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


フォト

「次回に続く」

0 0

コメント

mixiユーザー

ログインしてコメントを確認・投稿する

<2015年04月>
   1234
567891011
12131415161718
19202122232425
2627282930  

最近の日記