地方都市の駅前通りを抜けた先に、ひっそりと佇む三階建ての古びたビルがある。看板には「光進館予備校」とあるが、塗装はすでに剥げ、窓枠も少し錆びついていた。二十代半ばの佐伯悠真は、その扉の前で立ち止まり、大きくため息をついた。
「まさか、この歳でまた予備校通いすることになるとはな……」
シャツの裾は少しくたびれ、肩に掛けたトートバッグも形が崩れている。アルバイトを転々としながら、就職活動に失敗し続けた結果、悠真は最後の切り札として「基礎情報技術者試験」に挑戦することにした。IT企業に入り込むには資格が役立つらしい――友人の受け売りだが、藁にもすがる思いで申し込んだ。
中に入ると、教室には十数人の受講生が集まっていた。年齢層はばらばらで、大学生らしき若者もいれば、社会人風のスーツ姿も混じっている。悠真は空いた席に腰を下ろし、周囲を見渡した。壁際のホワイトボードには「算術演算と精度」と大きく書かれている。
(うわ、いきなり数学かよ……。俺、一番嫌いなやつじゃん)
げんなりした表情を浮かべていると、前方の扉が開き、講師が入ってきた。藤堂隆志――四十代半ば、黒縁メガネに少し白髪の混じった髪。スーツ姿だが、ネクタイは緩く結ばれ、どこか飄々とした雰囲気をまとっていた。
「さて、みなさん。今日から算術演算を学んでいきます。といっても、計算ドリルをやるわけじゃない」
低めの声に、教室が静まる。
「コンピュータはね、人間と違って『有限』の生き物なんですよ。たとえば――」
藤堂はポケットからコーヒーカップを取り出した。どこから持ってきたのか、受講生たちがざわつく。

「このカップに水を注ぐとしましょう。いっぱいになったらどうなりますか?」
「……溢れるに決まってるだろ」思わず心の中で突っ込む悠真。
「そう、溢れる。これがオーバーフローです。コンピュータが扱える数値の範囲を超えたとき、余った分はこぼれ落ちてしまう。どんなに優秀なマシンでも、器は有限なんです」
クラスの前列に座っていた女子が、興味深そうにうなずいている。彼女は高木美咲――理系出身らしい、冷静な雰囲気を漂わせる受講仲間だ。悠真は心の中で「真面目そうで俺とは正反対」とぼやく。
藤堂は続ける。
「よく『パソコンは無限に計算できる』と思っている人がいます。でも実際には、加算も減算も乗算も除算も、決められたビット数の範囲でしか表現できない。つまり、我々が頼りにしているデジタルの世界は、常に器の大きさと向き合っているんですよ」
悠真はペンを回しながら、半信半疑で聞いていた。
(当たり前のことを小難しく言ってるだけじゃないか? コーヒーカップの話で資格が取れるなら苦労しねえよ)
だが、藤堂の目は真剣だった。
「誤解しないでください。これは単なる技術的な制約ではない。有限性というのは、我々が生きている社会そのものに通じている。オーバーフローも誤差も、人間の営みと同じなんです」
そう言って、黒板に大きく「誤差=人間社会の縮図」と書き殴る。
教室の空気が一瞬、凍った。何を言い出すのかと受講生たちが顔を見合わせる。悠真も思わず苦笑した。
(……やべえ先生に当たったかもしれん)
しかし不思議と、その奇妙な比喩は耳に残った。コーヒーカップと数値の世界。オーバーフローと人間社会。胡散臭いけれど、どこか惹きつけられる。
窓の外では夕陽が差し込み、錆びた窓枠を橙色に染めていた。悠真の新しい日々は、ここから始まろうとしていた。
「パソコンの四則演算は無限じゃない?」
藤堂が黒板に「2,147,483,647」と書き殴った瞬間、教室はざわめいた。
「さて、これは何の数字でしょう?」
突然の質問に、誰も答えられない。受講生たちの顔に「暗号か?」という困惑が浮かぶ。
悠真も同じ気持ちだった。
(なんだこの桁数……。パスワードにでも使うのか?)
藤堂はニヤリと笑う。
「これはね、32ビットの符号付き整数で表現できる最大値です。これ以上の数を入れると、コンピュータは正しく扱えない。どうなるかと言えば――ほら、溢れるんです」
チョークが「-2,147,483,648」と書き加えられる。

「つまり、この最大値に 1 を足すと、マイナスの最小値に巻き戻る。まるで、満員電車で押し込んだら反対側のドアから人が飛び出すようなものですね」
教室に笑いが漏れる。だが悠真は苦笑いするしかなかった。
(人間なら当たり前に 1 足せば次の数字になるのに……。わざわざ巻き戻るなんて、不便すぎだろ)
隣の席の美咲は、さらさらとノートを取っている。涼しい顔で「ふむ」と頷く様子に、悠真は劣等感を覚えた。
「じゃあ、試しに計算してみましょう。誰か、この数に 10 を足したらどうなるか?」
藤堂が問いかける。
しんとした空気。誰も手を挙げない。仕方なく、悠真はぼそっとつぶやいた。
「……また反対側に飛ぶんじゃ?」
講師の目が輝いた。
「おお、いいですね佐伯君! そう、10を足したら -2,147,483,638 になる。人間から見れば理不尽ですが、コンピュータは有限の器で計算しているので、こうしたルールで動くしかないんです」
藤堂は黒板にカップの絵を描いた。そこに「32ビット」と書き込み、上限と下限を線で区切る。
「加減乗除すべて、この器の範囲内でしか成立しません。だからこそ、我々エンジニアは“どこまで入るのか”を常に意識しておく必要がある」
悠真は腕を組んだ。
(なるほど……。でも、やっぱり人間の直感とは違うな。俺たちは無限に数を思い描けるけど、パソコンは箱の中でグルグルしてるだけか)
藤堂は教室を見渡し、淡々と続ける。
「ここで大事なのは、“有限精度”という視点です。コンピュータは無限の知能を持っているわけではない。むしろ、とても窮屈な箱庭で計算している。その限界を知らずにプログラムを書くと、思わぬバグやトラブルを招くんです」
その言葉に、悠真は心の奥で少しだけ現実味を感じた。
(たしかに……。就活サイトで見た“システム障害で大混乱”ってニュースも、こんな小さな数の制限から始まってたりするのかもしれない)
チョークの音が止み、藤堂が黒板を軽く叩く。
「いいですか。パソコンの世界は、人間の思い込みほど万能ではありません。だからこそ、我々は範囲を意識し、誤差を恐れ、対策を講じる必要がある。……この感覚は、技術者を目指すなら最初に刻んでおくべきものです」
夕暮れの光が窓から差し込み、教室の空気を柔らかく染めた。
悠真はまだ納得しきれないものの、数字が単なる記号以上の意味を持ち始めているのを感じていた。
「コーヒーカップから溢れる数値」
藤堂は教壇の上にコーヒーカップを置いた。艶の落ちた白磁に、薄い茶渋が残っている。どこから持ってきたのか分からないが、その場違いな小道具に受講生たちの視線が集中した。
「さあ、ここに水を注ぐとしましょう。入る量には限界がある。いっぱいになったらどうなる?」
問いかけに、数人が小声で答える。「溢れる……」。
「そう、溢れる。これがオーバーフローです。コンピュータの数値も同じ。器が小さければ、無理に詰め込んだ分はこぼれ落ちる。どんなに頑丈そうに見えても、容量は有限なんですよ」
藤堂は黒板に「コーヒーカップ=32ビット」と書き、注がれる水を数値の流れに見立てて矢印を描いた。
「人間は無限に数を数えられると思いがちだ。でも実際には、マシンはこうやってこぼすんです。器を大きくすればこぼれにくくなるが、無限にはならない」
悠真は頬杖をつきながら、その図を見つめた。
(なるほど……。たしかにコーヒーカップの方がイメージしやすいな。数学の教科書よりマシかもしれん)
前列でノートを取っている美咲は、冷静に視線を黒板へ向けている。灰色の瞳が真剣に数字を追う姿に、悠真は少し気圧される。
「じゃあ、試しに考えてみましょう」
藤堂はチョークで「100mlのカップ」に「120mlの水」を注ぐイラストを描いた。

「余った20mlはどこに行く? 地面にこぼれる。それがオーバーフロー。コンピュータでは、こぼれた分は無視されたり、別の形で現れたりします」
悠真が小声で呟いた。「それって、めっちゃズルくね……?」
藤堂の耳がピクリと動く。
「いい観察だ、佐伯君。そう、ズルい。だが、その“ズルさ”を理解しておかないと、バグを見逃す。実際、銀行の残高計算で桁を超えて大混乱、なんて笑えない話が過去にありました」
受講生の間に小さな笑いとざわめきが広がる。
(なるほど、身近な話になると急に怖いな……。俺のバイト代が勝手にオーバーフローしたら泣くわ)
悠真は思わず苦笑した。
「まとめると――器に入る範囲を意識せよ、ということです。これは整数演算の基本にして核心です」
藤堂は黒板に太字で「範囲を意識」と書いた。
その文字を見つめながら、悠真の胸に小さな納得が芽生えた。
(ああ、やっぱりコンピュータって万能じゃなくて、不器用な人間みたいなもんなんだな)
夕陽が差し込み、教室のチョークの粉を金色に照らす。
その光景の中で、悠真は初めて「算術演算」というものを少し身近に感じていた。
「借金シミュレーションとシフト演算」
黒板の前に立つ藤堂は、再びチョークを走らせた。今度は「1000」という数字を大きく書き、矢印を左に引く。
「さて、シフト演算というものがあります。ビットを左に一つ動かすと、数はどうなると思いますか?」
教室に沈黙が落ちる。数字嫌いの悠真は、例によって答える気など毛頭なかったが、藤堂は構わず続けた。
「単純に倍になる。たとえば、1000円の借金をしているとしましょう。左にシフトすると、2000円。さらにもう一回シフトすると4000円。倍々ゲームです。どうです? 恐ろしいでしょう」
黒板に「1000 → 2000 → 4000」と書き並べ、さらに赤で「借金地獄」と殴り書きする。
「つまり、左シフトは“借金を倍々で膨らませる魔法”なんです」
クラスの何人かがくすりと笑う。
悠真は半信半疑でノートを開き、試しに「500」を書いてみる。左にシフトすると「1000」、さらに「2000」。
(おお、本当に倍々か……。確かに、借金の比喩は分かりやすいな)
藤堂は今度は矢印を右へ引いた。
「逆に右にシフトするとどうなるか。数が半分になっていく。借金も、返済を進めれば少しずつ減っていくように見えるでしょう?」
黒板に「1000 → 500 → 250」と書き、そこに「返済気分」と小さく添える。
「しかし、気をつけなければならないのは、小数点以下が切り捨てられることです。250を右シフトすれば125になるが、さらに進めれば62、31……端数は消えていく。借金が“一円単位でうやむや”になるようなものです」
悠真はペンを走らせながら、思わず苦笑した。
「右シフトは地味に得だな……」
隣でノートを取っていた美咲が小さく呆れ声を漏らす。
「返済を得だと思うあたり、発想が不健全ね」
悠真は肩をすくめた。
「数学嫌いな文系は、こうでもしないと覚えられないんだよ」
その軽口に、ほんの一瞬、美咲の口元が緩んだ。だがすぐに真剣な表情に戻り、ノートを取り続ける。
一方、藤堂は黒板に「左シフト=借金地獄」「右シフト=返済気分」とまとめて書いた。

「このように、シフト演算は非常にシンプルだが、使い道は多い。高速で掛け算や割り算を行う際にも応用されます。だが、借金ゲームを思い出してみればいい。便利な反面、油断すればすぐに破産するんです」
悠真はノートの端に「左=借金地獄、右=借金減らし」と落書きのように書き込んだ。妙に腹に落ちる説明に、心のどこかで「なるほど」と頷いている自分に気づく。
(意外と、こういう寓話的な説明の方が頭に残るんだよな……。やっぱり藤堂って、ただの変人じゃなくて本当に教えるのが上手いのかも)
教室の時計が静かに進む中、悠真は初めて「シフト演算」という単語を自分の言葉で説明できそうな気がしていた。
「有限の世界で生きるということ」
黒板には、すでに幾つもの図や数字が書き連ねられていた。カップのイラスト、オーバーフローの矢印、借金の倍々ゲーム――どれも一見すると落書きめいているが、不思議と筋が通っている。藤堂はそれを一つひとつ指でなぞりながら、教室全体に視線を巡らせた。
「よろしいですか。ここまでで学んだのは――加減乗除もシフト演算も、すべて有限の世界で行われる、ということです。コンピュータは無限の器を持っていない。むしろ、人間よりもずっと狭い器で窮屈に動いているんです」
彼はチョークで「有限」と大きく書き、その下に線を引いた。
「だからこそ、技術者は“数値範囲を意識せよ”。これを忘れた瞬間に、想定外のエラーや事故が起きる。器を知り、その限界を認めた上で、どう扱うかが肝要なのです」
悠真は、頬杖をつきながらその言葉を聞いていた。
(数値の範囲を意識しろ、ねえ……。人間なら無限に数えられるのに、機械の方が小さい器ってのは面白いな)
彼は思わず口を開いた。
「無限じゃない世界って、なんか……人間社会みたいですよね。給料も有限、休日も有限。器の小ささで争うとか、まんま会社みたいだ」
教室に小さな笑いが起こる。美咲がペンを止め、冷ややかに呟いた。
「うまいこと言ったつもり?」
悠真は肩をすくめる。
「半分冗談。でも、なんか似てません?」
藤堂は口元をゆるめ、黒板にもう一つの言葉を書き加えた。
「誤差は人間社会の縮図だ」

再び出てきた謎めいたフレーズに、教室が静まり返る。
「どういう意味ですか?」と、美咲が真っ先に問いかける。
「ふふ、それは次の講義でお話ししましょう。今日のところは“有限を意識する”だけ覚えて帰ってください」
藤堂はチョークを置き、腕時計をちらりと見た。ちょうど終了の時刻だった。
椅子を引く音が重なり、受講生たちが席を立ち始める。悠真はノートを閉じながら、黒板に残る「有限」と「誤差」の文字を見つめた。
(器の小ささ、範囲の限界……。俺の人生も、なんか似てるな。フリーターだし、金も時間も有限。オーバーフローするほど余ってりゃいいんだけどな)
苦笑しつつも、妙に胸に引っかかるものがあった。
「誤差は人間社会の縮図」――あの一言が、頭の隅に残響のようにこびりついて離れない。
古びた窓から夕闇が差し込み、教室の空気が静かに冷えていく。悠真は肩にトートバッグを掛け、ため息をつきながら出口へ向かった。だが心のどこかで、次の授業を少しだけ楽しみにしている自分に気づき、思わず苦笑するのだった。
「浮動小数点の不思議な世界」
翌週の授業。黒板の中央に描かれたのは、見慣れぬ大きな天秤の絵だった。左右に皿が吊るされ、片方にはすでに砂が山盛りになっている。
「さて、今日からは“浮動小数点”という世界に足を踏み入れます」
藤堂は天秤の片方にチョークで「1.0」と書き、もう片方に「0.0001」と記した。
「整数は器に入るかどうかで分かりやすいが、問題は小数点。ここでは“重さの差”が重要になる。たとえば、片方に1キロの砂があり、そこに0.0001キロを追加しても、天秤はびくともしないでしょう?」
教室がざわついた。悠真は思わず眉をひそめる。
(確かに……人間の感覚だと、ちょっとぐらい足したって見た目は変わらないよな)
藤堂は皿の上にチョークで小さな点を描き加えた。

「これが“桁落ち”です。大きな値と比べて小さすぎる数は、足されても無視される。コンピュータは桁を揃えて計算するので、表示できない部分は切り捨てられてしまうんです」
黒板には「1.0000 + 0.0001 = 1.0000」と書かれる。
「実際には足したのに、結果は変わらない。これが浮動小数点の恐ろしさです」
悠真はノートにその式を書き写し、ため息をついた。
(うわ……。なんかバイト先のレジと同じじゃん。1円以下は四捨五入されるから、結局ごまかされるんだよな)
前列の美咲が手を挙げた。
「先生、それって計算機が悪いんですか? それとも仕組み上仕方ない?」
「仕組みです。むしろ“仕方ない”を前提に設計されている。なぜなら、無限に桁を扱うのは不可能だから。現実世界で無限の精度を持つ天秤なんて存在しないでしょう?」
美咲は「なるほど」と短く答え、またノートに視線を落とした。
悠真はそのやり取りを横耳で聞きながら、妙な感覚を覚えていた。
(小さいものが無視される……。それって、生活でもあるよな。努力とか、ちっちゃな嘘とか。結局、大きな流れに飲まれて、誰も気づかない)
気づけば、自分の人生にも重ねていた。フリーター生活の中で、少しずつ積み重ねた小さな努力は、就活の“大きな数字”の前では無視されてしまった気がする。
黒板に目を戻すと、藤堂は天秤にさらに砂を加えていた。
「けれど、積もれば山になる。0.0001を1万回足せば1になります。だから、たとえ無視される小さな値でも、蓄積すれば無視できない結果を生む。ここに気づける人間だけが、誤差を制御できるんです」
藤堂の声が妙に響いた。
悠真はノートに「誤差=積み重ね」と殴り書きし、少し笑った。
(ああ、やっぱり人間社会みたいだ。小さなことをバカにしてると、いつか大きくなって返ってくる……ってことか)
窓から射す冬の光が黒板に反射し、天秤の絵を照らしていた。
「悪魔のように忍び寄る誤差」
藤堂は黒板に「0.1 × 10」を何度も繰り返し書いた。
「さあ、みなさん。簡単な計算ですよね。0.1を10回足せば、いくつになりますか?」
教室全体から一斉に「1!」という声が返る。もちろん、悠真も心の中で同じ答えを叫んでいた。
「その通り。理論値では1。ところが――」
藤堂はノートパソコンを立ち上げ、プロジェクタに計算結果を映し出した。画面には「0.9999999」という数字が浮かぶ。
「……え?」
悠真は思わず声を漏らした。
「おかしいですよね。0.1を10回足したのに、1にならない。これが誤差です。浮動小数点で表現された0.1は、実は“正確な0.1”ではなく、近似値なんです」
黒板に「0.1 ≒ 0.10000000000000000555」といった近似表現が書き殴られる。
「ほんのわずかな違いでも、繰り返せば積もっていく。これが累積誤差。悪魔のように静かに忍び寄り、最終的には結果を歪めるのです」
悠真はペンを握りしめ、手の中にじわりと汗を感じた。
(やば……。俺、試験でこんなの出されたらパニックだぞ。だって、正しく計算しても“正解”が違うとか……ズルくないか?)
美咲がすっと手を挙げた。
「先生、では試験ではどちらを“正解”とするんですか? 理論値と、実際の計算結果と」
藤堂は微笑んだ。
「いい質問ですね。試験では“理論上の正解”が問われます。ただし、実務では“実際の結果”のほうをどう扱うかが重要になる。つまり、机上の空論だけでは済まされないのです」
悠真はますます不安になった。
そのとき、藤堂が模擬演習プリントを配った。問題はこうだ。
「0.1を1000回加算したら、いくつになるか」
「理論値は100。でも、計算機でやると――」
悠真は電卓を叩いた。表示は「99.99998」。
「……マジかよ」思わず呟く。
「はい、そこ!」藤堂がにやりと指差した。
「その“マジかよ”が大事なんです。誤差はいつの間にか忍び込み、結果を歪める。だから、気づけるかどうかが技術者の資質を決めるんですよ」
悠真はノートに大きく「誤差は忍び寄る悪魔」と書き込んだ。胸の奥に冷たい感覚が残る。
(気づけるかどうか、か……。俺の人生のズレも、いつの間にか積み重なって、今の“フリーター”って結果になったのかもな)
彼は小さく苦笑したが、その笑みはどこか引きつっていた。
「居酒屋の割り勘と丸め処理」
授業の後半、藤堂は教壇に腰をかけながら、急にくだけた口調で話し始めた。
「さて、みなさん。居酒屋で割り勘をしたことはありますか?」
ざわつく教室。学生らしい受講生たちは頷き、社会人組は苦笑している。悠真も思わず心の中で頷いた。
(バイト仲間とよくやるな……。いつも端数でモメるけど)
藤堂は黒板に「3,333円 × 3人」と書いた。
「さて、合計は9,999円。これを3人で割ると……?」
チョークが走り「3,333円」と書かれる。
「一見、問題なさそうですよね。でも、現実にはおかしい。なぜなら1円余るから」
ざわつく教室。美咲が眉をひそめて呟いた。
「……たしかに。実際に会計すると、9,999円は存在しなくて、10,000円になりますね」
「その通り。じゃあ1円をどう処理するか? これが“丸め処理”の問題なんです」
藤堂は黒板に「切り捨て」「切り上げ」「四捨五入」と三つ並べた。
「たとえば全員が3,333円を払うと、1円足りない。誰かが1円余分に払うと帳尻は合う。これが“切り上げ・切り捨て”です。公平さを保つために、誰が払うかを順番に回す――これが“ラウンドロビン方式”」

悠真は思わず吹き出した。
「ラウンドロビンって……飲み会の幹事システムかよ」
教室がどっと笑いに包まれる。藤堂は涼しい顔で頷いた。
「ええ、そうです。つまり、丸め処理は社会生活そのもの。全員で少しずつ誤差を背負うか、誰かが代表して誤差を引き受けるか。そのルールを決めるのが重要なんです」
悠真はノートに「誤差=割り勘」と書き込みながら、少し真剣な気持ちになった。
(なるほどな……。計算の曖昧さを、ただのバグ扱いじゃなくて、うまく処理する工夫があるってことか)
美咲が手を挙げた。
「先生、つまり“どの方式が正しい”というのは存在しないんですか?」
「そうです。状況によって最適解は変わる。システム開発でも同じですよ。銀行の利息計算と、ゲームのスコア計算では、適用すべき丸め処理が違う。重要なのは“ルールを意識的に選ぶ”ことです」
その言葉に、悠真は深く頷いた。
(曖昧さを放置するんじゃなくて、ルールとして受け入れる。……人間関係とか社会も同じだな)
黒板には「丸め処理=曖昧さの制御」と大きく書き加えられる。
悠真は一円玉の絵を落書きしながら、妙に納得していた。
「誤差と生きる覚悟」
授業の終盤、藤堂はチョークを置いて両手を軽く広げた。
「さて――今日までで“オーバーフロー”“桁落ち”“丸め処理”と、いろいろ話してきました。どれも根っこは同じです。つまり、計算には必ず誤差がつきまとうということ」
黒板の中央に、太く「誤差」と二文字が書かれる。
「誤差は、なくならない。完全にゼロにすることはできません。むしろ、それをどう受け止めるかが肝心なんです」
静まり返る教室。受講生たちの視線が集まる。
藤堂は少し微笑み、言葉を続けた。
「以前、こう言いましたね――『誤差は人間社会の縮図だ』と」
悠真は思わず顔を上げた。あの時の謎めいた言葉が、ようやく繋がる予感がした。
「人間社会も同じです。完全に公平な割り勘はできないし、仕事も生活も、必ず不確かさやズレが生じる。誰かが少し余分に払う。誰かが得をする。小さな誤差を抱えながらも、全体は回っている。だから――誤差を嫌うだけではなく、誤差と共に歩む覚悟が必要なんです」
その言葉に、美咲が小さく頷いた。灰色の瞳がまっすぐ黒板を見据えている。
一方で悠真は、胸の奥に妙な感情が広がるのを感じていた。
(誤差と共に歩む……か。俺の人生なんて、誤差だらけだ。就活は外すし、バイトも長続きしない。まともなキャリアから外れて、全部ズレてる気がしてた。でも……)
気づけば、苦笑しながらノートに走り書きをしていた。
「人生=誤差だらけ。でも生きていける」
自分でも笑ってしまうほど安っぽい言葉。だが、不思議と心は軽かった。

「佐伯君」
唐突に藤堂が名前を呼んだ。
「……えっ?」
「君は先週、『無限じゃない世界は人間社会みたいだ』と言っていたね。あれはなかなか鋭い。まさに今日の話と繋がるんです。有限であること、誤差があることを前提に、それでもどう進めるか。そこに人間らしさがある」
悠真は耳まで赤くなり、周囲からクスクス笑いが起こった。美咲も横目で「良かったじゃない」と囁く。
照れ隠しに肩をすくめながら、悠真は思った。
(数学嫌いの俺でも、こうして少しずつ分かってきてる。誤差を嫌うんじゃなくて、うまく付き合っていく――それって案外、俺の得意分野かもしれないな)
窓の外では街灯が灯り始め、冬の夜気が忍び込んでくる。黒板には「誤差=人間社会の縮図」の文字が大きく残り、教室全体を見守るように輝いていた。
悠真はその文字を見上げながら、小さく息を吐き、ほんの少し前向きな笑みを浮かべた。
コメント