mixiユーザー(id:4556571)

2014年06月28日04:19

270 view

[X68]111111111×111111111を計算させたぞ![X-BASIC]

【数学】111111111×111111111=12345678987654321
http://news.mixi.jp/view_news.pl?media_id=85&from=diary&id=2937709


フォト

「やあ行き倒れだよ。前回mixiニュースで111111111×111111111の記事がタイムリーだったという日記を書いたけど、今回は実際にX680x0のX−BASICで走るプログラムを実際に書いてみました。」


フォト

「大分前に足し算と引き算とループだけで掛け算させるプログラムを書いたことを思い出し、そのプログラムを見てみたところ、なんとか作った人間の筆算の要領で莫大な桁同士の足し算をする超越加算サブルーチンを呼び出す形になんとかすることが出来るとわかり、やってみました。」


フォト

「前回の日記では現状ではこの計算をするプログラムは書けないと言ってましたが、やってみたんですね。」


フォト

「ひまなんだな」


フォト

電卓が限られた範囲の桁数しか扱えないのと同様、コンピュータにも限界が存在します


フォト

10億+10億は20億と計算出来ています
しかし、15億+15億を計算させたら途中で計算出来なくなってエラーになってしまいました
X−BASICでは整数は32ビット値を普通に扱えます
実は当時としては凄いことなのですが、32ビット値の有効範囲は普段はゆとりあるように思えて実はそうではありません

2の32乗を計算させると4294967296と出ますが、これがコンピュータが扱える整数の範囲です
でも実はそれより狭くて、実際はマイナスの値も扱うことを考えるとさらにその半分
2147483648までになります
扱える範囲は−2147483648から2147483647までになるのです


フォト

「10桁電卓より下かよ。」


11111×11111の答えは出せますが、111111×111111になるともう桁が溢れてエラーになってしまうほど、脆いものだったのです


しかし、もう少し大きな数値を扱える方法もあることはあります
111111×111111に#を付けたら計算出来てしまいました
X−BASICでは「#」を付けることで普段の整数計算とは違う浮動小数点計算をさせることが出来ます
小数点同士の計算をさせる際に必要なものなのですが、実はとても大きな整数を扱えるという側面も持っています

これが計算出来るなら111111111×111111111も計算出来ると思うはずです
計算することは出来ますが


フォト

このようになってしまうのです
これを指数表示といいます
上位の桁をいくつか表示して、実際は何桁もあるよと言うように表示します
これだと生の数値が見られません


フォト

「だから計算プログラムを書く必要があると言ったわけなんですね。」


フォト

「当たり。以前足し算引き算とループだけで掛け算するプログラムを作ったけど、それが功を奏した形になった。なんでも保存しとくもんだ。しかもそのプログラム見てもどういう仕組みだったか大体忘れていてな、もしノートに書いておいたメモがなかったら解析するしかなかった。」


フォト

これが実際のプログラムになります
一応ですが、超越加算ルーチンも多少改善しました
以前のものよりすっきりしていると思います
かなり軽くなりました


フォト

出た!


フォト

「やれることはやった。1111111111×1111111111を計算させると超越加算ルーチン使ってないところでオーバーフローになるけど現状大小比較出来なくてどうにもならんから知ーらないっと。」


フォト

「大変。ダメな大人がいるわ!」


超越整数加算ルーチンの動作原理を
コンピュータに意味のある値を見せると範囲をチェックしてちょっとでも範囲を超えるとこれはダメだよと言ってきます
そこで、文字にしてやりとりすることを考えました
文字はコンピュータにとってはただの記号です
この文字はこういう意味だと理解するまではそれがなんなのかわかりません
この原理を使って計算させるのです

例えば16+16を計算する場合

・「16」は2桁、「16」も2桁 数字を取り出す回数はそれぞれ2回である
・「16」と「16」という数字からそれぞれ1桁目の数字を取り出す 数字は紙に書いてある状態と同じでそれが数とわかるまでは計算に使うことは出来ません
・「6」と「6」を6と6と言う計算出来る数値に変換 数字と言う文字を数値という、計算するのに意味のある形に直すとコンピュータは計算出来る様になります。人間の脳はこれを無意識でやっています
・6+6+繰り上がり(0)=12 10を超えたので次の桁は繰り上がりが発生します 12−10で1桁目の答えは2 次の桁の計算のために繰り上がり(1)にしておく
・1桁目の計算結果2を「2」という文字にして答えの文字を記憶する答えバッファに
・「16」と「16」という数字からそれぞれ2桁目の数字を取り出す
・「1」と「1」を1と1と言う計算出来る数値に変換
・1+1に繰り上がり(1)を足すと3になりますね 10を超えていないので繰り上がりはありませんので繰り上がり(0)にします
・3を「3」という数字に変換して答えバッファに転送
・それぞれ数字を取り出せばいい回数は2回なので計算はおしまい
・繰り上がり(0)なので答えバッファに「1」は転送しない 「016」「016」で考えると0+0+繰り上がり(0)=0なので繰り上がりは発生しない
・答えバッファの中身は「23」になっていますが、もちろんこのままではおかしいので、答えバッファの中身を反転して「32」と言う文字の答えを返す

これがこの超越加算ルーチンの動作概要です

0 0

コメント

mixiユーザー

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

<2014年06月>
1234567
891011121314
15161718192021
22232425262728
2930     

最近の日記