登場人物紹介
僕:数学が好きな高校生。
テトラちゃん:僕の後輩。 好奇心旺盛で根気強い《元気少女》。言葉が大好き。
リサ:自在にプログラミングを行う無口な高校生。コンピュータを自在に操る赤い髪の《プログラミング少女》。
ある日の放課後。
僕はいつものように図書室に行く。
すると、二人の少女、 テトラちゃんとリサが並んで座っているのが見えた。
僕「テトラちゃん——」
テトラ「しー!」
テトラちゃんは唇に人差し指をあてて、(静かにして)のポーズ。
横にいるリサを見ると、腕組みをして座ったまま目を閉じている。
考えごとをしているようにも見えるけど、もしかして……
僕「リサちゃん、眠ってる?」
テトラ「そうです。だからお静かに」
テトラちゃんは小声でそう言った。
リサの前、そしてテトラちゃんの前にはそれぞれコンピュータが置かれている。
僕も小声になって尋ねる。
僕「二人でプログラミングをしてたのかな?」
テトラ「はい、そうです。 といってもリサちゃんは何か大きなシステムを作っているらしいです。 あたしはあたしで、 プログラミングの勉強をしていました」
僕「なるほど」
僕は改めて、 真っ赤な髪をして真っ赤なコンピュータを使う少女、リサを見る。
彼女は無口だけれど、プログラミングに長けている。
といっても眠りながら作ることはできないだろう……何か大きなシステムを作っている?
テトラ「ところで先輩。クイズを一つ出したいと思いますっ! このプログラムを動かすと、何が表示されるでしょうか」
テトラちゃんはそういってコンピュータを僕に向けた。
クイズ:何が表示されるか?
僕「QUIZという手続きが定義されていて……
テトラ「はい。その通りです」
僕「うん、これはわかる。簡単だよ。
「僕」の解答 $$ \begin{align*} &0.1\\ &0.2\\ &0.3\\ &0.4\\ &0.5\\ &0.6\\ &0.7\\ &0.8\\ &0.9\\ &1.0 \end{align*} $$
テトラちゃんは、僕の解答を見て、 大きな目をいたずらっぽく光らせた。 彼女にしては珍しい表情だ。
テトラ「先輩、やっぱりそう思っちゃいますよね?」
僕「えっ、違うの? $0.9$ までしか表示されないってこと? それは違うよ。 だって、A3の条件は $$ x \neq 1.0 $$ なんだよ。
テトラ「はい。そう考えるのはもっともなんですが……」
僕「わからない……」
テトラ「実際に動かした結果はこちらになります」
テトラの解答
$$ \begin{align*} &0.1\\ &0.2\\ &0.30000000000000004\\ &0.4\\ &0.5\\ &0.6\\ &0.7\\ &0.7999999999999999\\ &0.8999999999999999\\ &0.9999999999999999\\ &1.0999999999999999\\ &1.2\\ &1.3\\ &1.4000000000000001\\ &1.5000000000000002\\ &1.6000000000000003\\ &1.7000000000000004\\ &1.8000000000000005\\ &1.9000000000000006\\ &2.0000000000000004\\ &\vdots \end{align*} $$
※注意:この結果はプログラミング言語に依存します。
僕「え?」
テトラ「実はこのプログラムは終わりません。表示は永遠に続きます。 なぜなら、A3からA6の繰り返しは無限ループになるからです」
僕「A3→A4→A5→A6→A3→A4→A5→A6→……をずっと繰り返すということ?」
テトラ「その通りです。A7には絶対にたどり着きません。 このクイズのポイントは浮動小数点数にあります。 コンピュータでは $0.1$ のような数は、 浮動小数点数として扱われることがよくあります。 でも、浮動小数点数を扱うときにはとても注意が必要なんです」
僕「ああ……それは聞いたことがあるよ。 $0.1$ のような数は、コンピュータでは近似値としてしか扱えなくて、 何度も足していくと誤差が溜まっていくのでぴったり $1.0$ にはならない?」
テトラ「そうですね。 大雑把にいえばそういうことです。 この実行結果では、 $0.9999999999999999$ の次が $1.0999999999999999$ になっていて、すでに $1.0$ を越えちゃっています。 ですから、あとは $0.1$ をいくら足しても $x$ の値は増えるばかりで、 $1.0$ と等しくなることはありません」
僕「これは注意がいるなあ……あ、でもこれってプログラミング言語によって結果が異なるんじゃない?」
テトラ「そうですね。表示される内容はプログラミング言語に依存します。 しかし、 多くのプログラミング言語で無限ループになるんです」
僕「そうなんだ」
テトラ「はい。 表示される内容は《$x$ の値を表示する》という処理の実装で異なるかもしれませんが、 多くのプログラミング言語で無限ループになります。 浮動小数点数を扱う標準規格があって、 それに準拠しているなら、同様の現象になるはずです」
僕「標準規格?」
テトラ「ええと、確か……」
リサ「IEEE 754」
僕「うわっ!」
テトラ「きゃあっ!」
突然リサが声を出したので、僕とテトラちゃんはびっくりした。
リサ「規格の名前」
テトラ「起きてたんですか?」
リサ「いま起きた」
リサは、いつものハスキーな声でそう言うと、 自分のコンピュータのスクリーンセーバを解除して何かをチェックし、 すばやくタイピング。
そしてまた腕組みをして目を閉じる。
テトラ「リサちゃん、お休みなさい」
リサ「《ちゃん》は不要」
僕「睡眠再開なんだね」
リサ「いまは《彼》が仕事中」
テトラ「彼?」
僕「彼?」
リサは目を開けることなく、自分の真っ赤なコンピュータを指さした。
僕とテトラちゃんは顔を見合わせて苦笑する。
テトラ「先輩……あたしたち、何の話をしてましたっけ。Where were we?」
僕「無限ループの話だったかな」
テトラ「そうでした、そうでした……ともかく、 浮動小数点数を使ってループ終了の判定をするのはよくない方法です。 特に等式を使ってループ終了の判断をするのはよくありません。 せめて不等式を使うか、あるいはもっといいのは整数を使うことです」
僕「テトラちゃん、ずいぶん詳しいんだね」
テトラ「いえいえ。 たまたま、 そのあたりのことをいま勉強していただけです」
僕「ああ、リサちゃんと一緒に?」
僕はリサをちらっと見た。
彼女は、腕を組んで目を閉じた姿勢に戻っている。
テトラ「あたしは、 AIさん に質問して学んでいました」
僕「へえ……」
テトラちゃんは、AIとの過去ログを僕に見せてくれた。
テトラ「こんにちは、AIさん」
AI「テトラさん、はじめまして! 今日はどのようなことでお手伝いしましょうか。どうぞお気軽に何でも質問してください」
僕「はじめまして?」
テトラ「先日、対話履歴とプロフィールをまちがって消しちゃったんです……なので、 AIさんはリセットされちゃいました。あたしのことも覚えていません」
彼女は、さみしげにそう言った。
僕は過去ログの続きを読む。
テトラちゃんとAIの《対話》の記録だ。
テトラ「プログラムで $0.1$ を繰り返して足していくと $1.0$ にならないという現象について解説してください」
AI「コンピュータで $0.1$ を何回も足すと、 思った通りの結果にならないことがあります。 これはコンピュータが壊れてしまったわけではありません。 コンピュータは $0.1$ を正確に表すことができないからなんです。 正確な値との違いはほんの少しですから心配する必要はありませんが、 何度も繰り返すとその違いが大きくなってしまうんですよ。 コンピュータでプログラミングするときには、 さまざまな注意が必要になるんですね」
テトラ「ご説明ありがとうございます。 あたしはプログラミングのことを少し知っている高校生です。 きちんと学びたいと思っているので、 専門用語も含めてもう少し詳しく教えてください」
僕「なるほどね。このAIは、 テトラちゃんのことを忘れちゃったから、 ピント外れの回答をしてきたんだね」
テトラ「そうですね。 AIさんの回答は、 あたしの期待した方向とは少し違っていました。 ですから、あたしがどういうことを知っていて、どんなふうに回答してほしいかを改めて伝えました」
AI「テトラさん、わかりました。 それでは少し詳しく説明しますね。 コンピュータは数字を $2$ 進法で扱いますが、 $10$ 進法で表記した $0.1$ は $2$ 進法で表すと $$ 0.00011{}0011{}0011\ldots $$ のように、無限に続く小数になります。 でも、コンピュータの中では限られたビット数でしか数を保存できないので、 どこかで切って近い値にするしかありません。 このような仕組みで表された数は、 浮動小数点数と呼ばれます。 浮動小数点数で繰り返し計算すると、 もとの誤差が少しずつ積み重なって、 見た目にもズレが生じてしまうことがあります。 これは丸め誤差と呼ばれ、 プログラムを書く上でとても基本的な知識の一つです」
テトラ「細かいことかもしれませんが、 いまの説明で気になるところがあります。 AIさんは『コンピュータは数字を $2$ 進法で扱います』と説明しましたが、 『数字』というよりも『数値』ではないでしょうか」
AI「テトラさん、ご指摘ありがとうございます。 とても良い観察ですね。 確かに『数字』よりも『数値』のほうが適切な表現です。 『数字』は $0,1,2,3,\ldots,9$ のような文字あるいは記号のニュアンスが強く、 『数値』は量としての意味が強いからです」
僕「なるほどねえ……」
テトラ「どうしました?」
無料で「試し読み」できるのはここまでです。 この続きをお読みになるには「読み放題プラン」へのご参加が必要です。
ひと月500円で「読み放題プラン」へご参加いただきますと、 450本以上の記事がすべて読み放題になりますので、 ぜひ、ご参加ください。
参加済みの方/すぐに参加したい方はこちら
結城浩のメンバーシップで参加 結城浩のpixivFANBOXで参加(2025年8月1日)