(魔法少女育成計画の原作漫画見てるからダメージが小さくて済んだが、やはり今回の回のダメージでかいけど)
「やあ、行き倒れだよ!思いっきり怪しげな日記タイトルにしてみたよ!大げさだからとJAROとかに訴えたりしないでくださいよ!間に「な」を入れたからセーフなんだよ!」
現代の魔法、コンピュータ
なんでも計算出来る?
初めて電卓を手に入れた時、1×2×3・・・と入力する遊びが好きでした。
しかし、電卓だとあっという間に限界を迎えてしまいます
これはコレクションのひとつの8桁の電卓ですが、この状態に1でも足すと
9桁目になるのでオーバーフロー(桁あふれ)でエラーを出して止まります
この電卓は全桁の小数点を表示することでエラーを示します
リセットして、1×2×3・・・と繰り返し、11までは計算出来ますが
12を掛けたとたん、桁あふれでエラーになりました
もっと高性能な関数電卓を使うとこれ以上も計算出来るのですが途中で省略された形の表示になってしまいます
では現代の魔法、コンピュータを使いましょう
X68のエミュレータを起動し、X−BASICを立ち上げます
プログラムを組むのがめんどうなので、まずはダイレクトに計算させると・・・
あっという間にエラーになってしまいました
やはりめんどうなのでざっとプログラムしました
13まで掛けようとしたところでエラーになっています
答が入る変数ansをもっと大きな数が扱える浮動小数点型にしてみます
floatで答の入る変数ansを宣言するように変更します
浮動小数点型変数は小数点の入った数値を扱うものというのが一般ですが、とても大きな整数を扱うことも出来ます
すると・・・先ほどよりは先に進みましたが途中から指数表示と言う省略した形で表示されるようになってしまいました
なぜこうなるのでしょう?
現代の魔法の石、いわば宝石、コンピュータの頭脳であるマイクロプロセッサ
実はマイクロプロセッサの中に入っている計算機はそれほど大きな桁を扱えるようになっていません
その代わり、極めて高速な計算が出来るようになっています
マイクロプロセッサの中には電子式のそろばんが何基も入っているようなものと考えて頂ければなんとなくイメージが湧くと思います
そのそろばんで計算する人の数が多少意味は違いますがコア数と覚えればいいかと
今の時代は8コアとかもう普通にあるのが凄いと思います
ただ、そろばんのように10進でなく2進なので、1桁あたりのそろばんの珠は1つです
スイッチのON,OFFの組み合わせで数値表現をしたり計算しているのです
もちろん桁数は限られています
では、無理矢理プログラム上でなんとか大きな数を扱う方法はないのでしょうか
私なりに当時悩みつつ出した方法です
実はあります
例として数12345678901234567890を記憶させてみる試みです
int型(整数型)の変数に入れようとしても「型変換に失敗しました」と言うエラーが出ました
これは12345678901234567890と言う数は整数型ではなく本来は浮動小数点型だろうと言っているのです
範囲チェックでひっかかり、あまりに大きい数なのでこれは浮動小数点型の数だろうとX−BASICは思ったわけです
では次に浮動小数点型の変数に入れてみます
無事、記憶された感じですが、いざ中身を表示するとやはり指数表示と言う省略された形に変換されています
では最後の手段です
なんと無事に入っています
ちゃんと記憶されているか表示させてみると省略されず完全に表示されています
最後の手段とは・・・実は文字として記憶させたのです
X−BASICはstrで宣言した変数に対して文字を扱えます
コンピュータからすれば、人間的に言えば文字と言うのは紙に描かれた物と同じ状態です
そのままではその文字の意味はなんなのかわかりません
文字数さえ範囲内ならなんでもOKなのです
この性質を逆手に取って記憶させたのです
これで解決・・・とは行きません
では12345678901234567890+12345678901234567890を計算させてみましょうか
なんか変ですね?
それもそのはず、単にお互いの文字列がくっついただけです
数を紙に描いたものが数字
aとbの紙がくっ付いただけなのです
これでは計算以前の問題です
最も数字同士を計算するなんて使い方は本来想定されていません
ただし文字型変数はいろんな専用命令を使ってかなり自由に制御することが出来ます
1文字ずつ取り出したり、中には記憶した文字列を逆の並びにしたりと強力なものもあります
もちろん数字→数値に変換する命令もありますし、数値→数字に変換する命令もあります
物凄く多い桁の数同士を計算させる、つまりは多数桁計算をコンピュータにさせる知識なんて私には当然ありません
そこで私が思いついたのは小学校に行った人なら誰でも習う多数桁計算の方法・・・筆算のメカニズムを解析してそれをプログラムすると言う「良くわからないモノにはすでにわかっている方法の組み合わせで挑むドラえもんののび太の方法論」です
読み込んだ数字を1桁ずつ読み込み、コツコツと繰り上げなどの処理をして計算させる
これがですね、意外と手こずったんです
とにかくいろんな数字同士の足し算を筆算でやってみる
最初の内は「私は何をやっているのだろう」と言う気分になりましたが、やっている内に「こういう時はこのように処理している」などの傾向が見えてきました
今風に言うと生態模写とかバイオロボティックスですね(言い切れば勝ちだ)
こんな風にまとめた紙を見ながらプログラム化していきました
2014年ごろに作ったプロトタイプから改良を重ね、現在の最新のものがこれです
思ったより複雑なものになりました
これでも当初のものよりは効率良くなりました
私達が普段使っている10進法で最大255桁まで扱える加算計算機です
何が恐ろしいかって実はマイナスなどの符号処理なし、小数点を扱う部分もなしの整数しか扱わない小学1年生仕様なんですよ、コレ
敢えて言おう
小学校で習うものは実はかなり高度だった!と
まあ一生使う基本のものになりますからね、当然と言えば当然かもしれませんが
だから当時勉強嫌いだった私が今更ですが言いましょう
少なくとも小学校で習うもんはしっかり勉強しとけ!と
アニメ、漫画、ゲームを楽しみたいなら特にだ!
これは同じく人間の筆算の掛け算の仕組みを解析してプログラム化したものの最新版です
以前、私の作ったこの10進乗算機の仕組みを解説した連載をここで書いていたのですがだんだんとボリュームが大きい内容だと言う事がわかってきて、現在中断中ってわけです
筆算の掛け算の解析の図
先に大きな数字同士の加算を作ったので、実は繰り上げ処理を何とかした後はそれほど苦労しなかった
はっきり言って足し算のメカニズムの方がはるかに複雑だったよ!
「この連載そのうち再開させたい・・・気力出ないけどorz」
もちろんこの10進乗算機も符号なし、小数点扱いもなしの小学3年生仕様ですー
では苦労して作ったこれらの10進加算機、10進乗算機を使って1から100まで掛けた数の答えを計算させちゃいましょう!
本当、この方法を思いつくまでは、こういった計算は大型コンピュータやスーパーコンピュータでないと出来ないと本気で思っていました
考えてみれば簡単な事でした
作り出すのは大変でしたが、小学校で習ったことの組み合わせだけで出来るのです
基本ってのは凄いですね
99年、下手すれば100年以上使い続けることを小学校では学ぶのですから当然なのかもしれませんね
先ほどざっと組んだプログラムを再び
このプログラムではマイクロプロセッサ内の計算機を通常の使用の範囲内で使って計算しているだけです
扱う数値の範囲が範囲外になったのでエラーになった
それだけのことなのです
X−BASICは命令の意味を常に解釈しながら実行していく言語です
このような言語はインタプリタ言語と呼ばれます
命令を解釈しながら実行するのでかなりスピードを食われますが、このような言語は対話型とも呼ばれ、即時性に優れます
BASICは初心者向け言語と呼ばれており、入門に最適です
X−BASICは当時のコンピュータで一般的だったBASIC言語をはるかに上回る柔軟性を持ち、構造化プログラム、豊富なループ制御、再起呼び出しが可能、サブルーチンを関数として定義出来る、アセンブラで命令を自作して関数として増設出来る、同時代のBASICと比較して巨大なメモリを使用可能など、一線を超えたツールとして活用出来る性能を持っています
では次は、サブルーチンをあたかも関数のように使うやり方でマイクロプロセッサ内の計算機の限界を超えましょう!
これがそのプログラムです
このプログラムのメイン部分は昔に組んだものなので使っている変数の名前が違っていて先のものと比較しにくいとは思いますが良く見ると計算させている部分がbig_scale_mulと書かれていると思います
これで苦労して作った10進乗算機、10進加算機で計算してくれるようになります
マイクロプロセッサ内の計算機を別の使い方で使うことで、通常時の計算範囲を超えた計算をさせることが可能になります
処理速度は通常より格段に落ちますが、処理能力ならプログラムと言う方法で上げることが出来ます
プログラムは時にコンピュータの限界を突破する方法にも使うことが出来ます
だからプログラムは楽しいと思います大変だけど
これはいわゆるソフトウェア計算と同じことをさせています
これが個人でスーパー「な」コンピュータを手に入れる方法です!
未知数を遥かに超えた桁数の数にゾクゾクしていただけたら嬉しいです
この数は合っているのか?と思いますよね
アドレスバーに「1から100までかけた答え」と打ち込んでENTERキーをターン!とやってみてくださいませ
どこかの誰かが既にこの答えを出していてくれて本当によかった
もしなかったら自力で検証するするしかないわけで、どう検証すればいいの?筆算で1から100まで計算するなんてなんの罰ゲームですかって話になります
多分私がやった方法より格段に良くて、私よりはるかに頭の良い人が、はるかに良い設備のコンピュータに計算させたものなのでしょう
マッキントッシュの世界では大分前からマスマティカと言う数学ソフトがありましたからそれで計算したんでしょうかね先に計算した人は
それともそれこそ本当に昔に大型コンピュータで誰かが計算させたか
でも載っていたのを先に見たとしても「へー本当にこんな数字になるの?」になるでしょう?
今回は「載っていたことが本当か確かめるために実際に計算させてみる」と逆のことになったんです
グーグルでいろんな山が見つかりますよ
それを登山するのも楽しみ方です
もし自分の見つけたものが、グーグルになかったら?
ひょっとしたら論文として発表出来るものかもしれませんよ!
実証は大変ですけど
そのたまたま見つけたあなたにとっての未知のものは誰かが求めている新しいものかもしれませんよ
現代の魔法、コンピュータ
呪文で1発とはとてもいかない泥臭いものなのです
「ロマンを感じてもらえたら嬉しいです。通信簿で算数は2か3、数学はずっと2だった行き倒れがお届けいたしました!」
ログインしてコメントを確認・投稿する