このページの本文へ

遠藤諭のプログラミング+日記 第5回

ゼロ除算と知られざるカシオミニCM-606の秘密

2016年09月23日 19時00分更新

文● 遠藤諭/角川アスキー総合研究所

  • この記事をはてなブックマークに追加
  • 本文印刷

 数学の歴史上「0の発見」は大きなトピックだった。その0で割るということほど哲学的な計算はないのだが、コンピューターにとっても典型的なバグのもとなのだ。(今回は「週刊アスキー連載中の『神は雲の中にあられる』より転載です)

1977年TI製数のおけいこ電卓=ゼロで割ってはいけない!

バグなのか? 私は擁護したいのだが

 “ゼロ除算”の話を書こうと思ったのは、今年4月に、ネット上で電動機械式計算機が“0”で割り算したために止まらなくなった動画が流れまくったからだ。ギズモード・ジャパンの「禁断の演算《0で割る》を古いコンピューターにさせたところパニック状態に」という記事でご覧になった人も多いと思う。

 しかし、これ“パニック状態”でもなんでもないのである。電動機械式計算機というのは、こんな調子でいつも動いているものなのだ。

 さらにいえば、この記事で「やっぱり古い機械式計算機ってとんでもないんだな!」という印象を受けた人が多いと思うけど、このウェーデン製の“FACIT ESA-01”という機械式計算機って割り算できるだけでも凄い。

 なぜそんなふうに言うかというと、コンピューターに搭載されているCPUで割り算できないというのはめずらしくないのである。iPhoneをはじめスマートフォンなどに搭載されて、いまや世界で最も使われていると思えるのがARM系のCPUだ。ところが、そのARM自体には数年前にようやく対応したコアが追加されるまで割り算の命令がなかった。

 みんながよく知っているインテルの86系やIBMの大型機に、除算命令があるので当たり前と思っている人も多いのだと思う。割り算命令が省略される理由は、滅多に使わない割にはチップ上の演算回路の面積をとってしまうからだそうだ。

 それでは、そんなときにスマートフォンの中で割り算はどのように行われているのかというと、この古い機械式計算機と同じようなものでバタバタと処理を繰り返して求めている! ということで、古い機械式計算機をバカにしてはいけないよ、という気分になってしまったのだ。

 ちなみに、米国GIZMODOのタイトルは、「古い機械式計算機がなぜ0除算が間違っているか教えてくれる」というそのままのタイトルになっている。

 ひょっとしたら、あまりに身の回りのものが電子化されたために、機械がけたたましく動き続けるという感覚が、いまの日本人には馴染みの薄いものになっているのかもしれない。機械があのくらいのペースで動くというのは、明治時代の自動織機からめずらしいお話ではなかった。

 それで、この記事のネタ元としてリンクされているのが「ポピュラーメカニクス」(どちらかというと騒ぎ立てたのはこいつ)だが、よく見ると動画自体は7年も前にユーチューブにアップロードされたものである。「修理後の動作チェック」と題してアップロードされたもので、修理がうまくいかずにこのような結果になってあきれてアップロードされた動画の可能性もある。

 なぜそう思えるのかというと、私はドイツ製の“ブルンスビガ 11”という電動機械式計算機を持っているのだが、これがときどき計算ミスをしでかすのだ。

このカッコいいズッシリ重い機械が、機械式計算機の会の渡辺祐三さんから譲り受けたブルンスビガ 11というモデルだ。同社は、拳銃のワルサーと並ぶドイツの機械式計算機メーカーで、オドナー以降のメカニズムの改善で大きな貢献をしている。

 “FACIT ESA-01”がフルオートマチックであるのに対して、私のE11はセミオートマチックなので雰囲気は違うのだが、歯車が滑って本来よりも回り過ぎてしまうことがある(ちなみにブルンスビガ 11では0で割り算しようとするとキーそのものを押せなくなっていました)。

 FACITといえば、世界最初の機械式計算機である“オドナー”(Odhner)の流れをくむ由緒正しき計算機メーカー。そのことも、ここで触れないわけにはいかないのだが、動画のESAシリーズは1940年代に登場しているので、機械式計算機全盛期の最先端製品といってもよいだろう。

 同社の計算機は世界中の40カ国に輸出されていたそうな(私もFACIT製品を1台だけ持っているのだが、それは、シャープがOEMしていたニキシー管電卓である)。そんな、トップクラスのメーカーが“ゼロ除算”に対応していないなんてありうるのだろうか?

 ゼロ除算といえば数学の世界の“禁じ手”のようなものでやってはいけないことになっている。よく計算式を使ったパズルで、最後にありえない答えが導かれるものは(正しく途中の計算をしたつもりが“1=2”が証明されるなど)、変数でうまく隠しながら途中にゼロ除算をさせているケースがよくある。

 一方、コンピューターの世界でも、“ゼロ除算”は初心者がやらかすエラーの典型的なものだ。ウィキペディアにも“ゼロ除算”という項目が立てられていて「コンピュータなど計算機においても、ゼロ除算に対するふるまいは様々である。たとえば浮動小数点数の扱いに関する標準であるIEEE 754では、数とは異なる無限大を表現するものが結果となる。他には、例外が起きてプログラムの中断を引き起こすかもしれないし、例えばナイーブに取尽し法を実行しようとしたなら無限ループに陥るか、なんらかの最大値のようなものが結果となるかもしれない」とある。

 さりげなくコンピューターでも“無限ループに陥る”と書かれているではないか!

 ところで、このゼロ除算、英語では“Division by zero”と表記して、米国人はこれ本当に好きなようだ。ちょっと検索すればわかるけど、これをネタにした動画もいっぱいあって、必ず地球が滅亡することになっている。しかも、0で割る元の数は“42”がお決まり。これはもちろん、『銀河ヒッチハイク・ガイド』の「生命、宇宙、そして万物についての究極の疑問の答え」と説明するのも野暮ですが。

 ということで、私も、42を0で割ってみることにした。取り出したのは、引き出しに入っていたカシオミニの“CM-606”。42を0で割ると、画面に0が6個並んでエラーメッセージかと思ったら、カシオミニ独特の“小数点以下を見るキー”を押すと、“420000”から延々と1ずつ数えあげているのでありました。電卓の初期に売れまくって担当者がたぶん忙しすぎたんだと思いますけど、やっぱりゼロ除算ってコワイ。

「カシオミニの特定モデル(CM-606)」でゼロ除算。42と入力(0~999999までどんな数字でもOK=左上)、“÷”を押して“0”を入力(右上)、“=”キーを押すと“000000”と表示されてエラー表示なのかな? と思うと……(左下)。カシオミニでは“ダブルレングス”キーを押すと小数点以下が表示されるようになっているのだが“420000”から延々と数字をカウントし続けているのでした(右下)。

カテゴリートップへ

この連載の記事
ピックアップ