アイキャッチ
TOP > 叡智の辞書 > イプシロン比較 (ε比較)

『イプシロン比較 (ε比較)』とは何か…

  • 「0.1を3回足しても0.3にならない」—— そんなコンピュータ世界の不可解な“魔物”に立ち向かうための盾、それがイプシロン比較です。数学の深淵から語り継がれる「誤差の許容」という知恵が、いかにしてゲームの物理判定や座標計算の正確さを守っているのか。その厳格にして繊細な技術の系譜を紐解きます。
Claude (Sonnet 4.6)
の知恵も編み込み、説明して進ぜよう…

概要

動小数点数の演算では、理論上等しいはずの値が誤差によってわずかにズレてしまう。 イプシロン比較とは、そのズレが許容誤差ε(イプシロン)の範囲内に収まるかを判定することで、 「実質的な等値」を安全に扱うための比較手法である。

使用例

  • プレイヤーの座標とゴール座標を単純に == で比較していたところ、浮動小数点誤差によって永遠に「到達」と判定されないバグが発生した。 そこでイプシロン比較を導入し、\( |pos - goal| < \epsilon \)が成立したときに到達とみなすよう修正したところ、問題は完全に解消された。
  • 3Dモデルの頂点座標をマージする処理では、完全一致ではなくイプシロン比較を用いて「十分に近い座標」を同一点として扱うことで、 浮動小数点誤差に起因する「微細な亀裂(クラック)」の発生を防いでいる。

詳細解説

浮動小数点という「魔物」の正体

コンピュータは、無限に続き得る実数を有限のビット列に押し込めるため、IEEE 754形式の浮動小数点数という規格を用いる。 32ビット単精度浮動小数点(float)では、仮数部・指数部・符号部に分けて実数を近似表現するが、この「近似」という言葉にこそ罠が潜んでいる。 例えば 0.1 + 0.2 の結果は、数学的には 0.3 であるにもかかわらず、コンピュータ上では 0.30000000000000004 となることが多い。

これは欠陥でも不具合でもなく、二進数という言語で十進数の世界を語ろうとしたときに生じる、構造的かつ不可避の「訛り」なのである。 ゲームの世界でこの魔物を野放しにすれば、当たり判定はすり抜け、物理演算は発散し、ゴールには永遠に「到達できない」という怪奇現象が起きる。

イプシロンという「番人」の登場

そこへ颯爽と登場するのが、ギリシャ文字の ε(イプシロン) である。 数学の世界では古くから「非常に小さな正の数」を表す記号として用いられてきた。

数学的解析学(Analysis)における「ε-δ論法」がその源流であり、 19世紀にKarl Weierstrassらが「極限」の厳密な定義を与えるために整備したこの論法では、εは「誤差の許容範囲」を象徴する存在であった。 その哲学が、20世紀のコンピュータサイエンスへと受け継がれた。イプシロン比較の本質は単純明快だ。

$$|a - b| < \epsilon \quad \text{ならば} \quad a \cong b \text{(実質的に等しい)}$$

「ぴったり一致しているか」ではなく、「ε以内の距離にいるか」を問う。 これはまさに、勇者が「完璧に目的地へ辿り着いたか」ではなく「宝箱に手が届く距離にいるか」を判定するようなものだ。

εの値選びという「魔法の調整」

イプシロン比較の実装で最も悩ましいのが、εをいくつに設定するかという問題である。 小さすぎれば誤差を吸収できずに比較が失敗し、大きすぎれば本来「違う」ものを「同じ」と誤認してしまう。

ゲームエンジン開発の現場では、用途ごとに複数のε定数を使い分けることが一般的だ。 例えばUnityエンジンでは Mathf.Epsilon(約1.4e-45、floatの最小正値)と Vector3.kEpsilon(約1e-5)が区別されており、 後者は座標比較などに用いられる。

物理演算では 1e-6 程度、衝突判定では 1e-3 程度が使われることも多い。 これはまさに、武器ごとに攻撃射程を細かく設定するゲームデザインの発想に通ずる。 εは「許容の剣」であり、その刃の長さを誤れば世界は崩壊する。

「相対ε」という上位魔法

さらに高度な使い手は、相対イプシロン比較という技を習得する。 絶対値εは、比較する数値が非常に大きいとき(例:座標が10万単位を超えるオープンワールド)に破綻しやすい。 100000.0 と 100000.001 の差はわずか 0.001 だが、その文脈では十分「同じ」と見なしたい場面もある。 そこで、差を比較する数値の大きさで割った「相対誤差」で判定する手法が生まれた。

$$|a - b| \ / \ max(|a|, |b|) < \epsilon$$

あるいはJohn Harrisonが提唱した ULP(Units in the Last Place)比較 という強力な手法もある。 これはfloatのビット表現を整数として解釈し、「浮動小数点数直線上で何ステップ離れているか」を直接数える方法だ。 精度の限界を知り尽くした者だけが使いこなせる、まさに上位呪文である。

ゲーム開発者よ、εを身に付けよ

歴史を振り返れば、浮動小数点誤差が引き起こした事故は決して笑い話ではない。 1991年のパトリオットミサイル防衛システムの失敗は、時刻計算における浮動小数点の累積誤差が原因で28名の命が失われた、 痛ましい実例として記録されている。

ゲームの世界ではそこまでの惨事はないとしても、 プレイヤーが「絶対に通れないはずの壁を通り抜ける」「判定が理不尽にズレる」という体験は、ゲームの品質と信頼を著しく損なう。

イプシロン比較は、華やかな魔法でも奥深いアルゴリズムでもない。 しかしそれは、浮動小数点という「訛りを持つ言語」でプログラムを書く者が、必ず身に付けるべき基礎の盾である。 εという小さな番人が、あなたのゲーム世界を崩壊から静かに、しかし確実に守り続けている。

(2026/03/08)