FE EXAM

アンダーフロー(小さすぎて0になる現象)

浮動小数点数で表現できる最小値より小さい値は、コンピュータが「0」として扱います。これがアンダーフローです。値を小さくしていって、いつ「ゼロに丸められる」のかを確かめましょう。

INTERACTIVE VISUALIZATION
正常
非正規化
アンダーフロー
現在の値
1 × 10-39
単精度浮動小数点での扱い
非正規化数(精度が落ちる)
実際にメモリに保存される値
1e-39
値(10^n)1e-39
1e-501
プリセット
スライダーを左に動かして値を小さくすると、3段階の挙動が見えます: 正常(緑)→ 非正規化(橙)→ ゼロに消える(赤)。橙の領域では精度が落ち、赤の領域では値そのものが消失します。
単精度浮動小数点の表現範囲(対数スケール)1e-501e-401e-301e-201e-101e01.4e-451.18e-38現在: 1e-39アンダーフロー値が消える非正規化精度が下がる正常フル精度で扱える
非正規化数(精度が落ちる)
値は表せるものの、仮数部の先頭ビット「1」が使えず精度が落ちます。
解説

📌
アンダーフローとは

表現可能な最小値を下回るとどうなる?ゼロに丸める正常に表せる最小値0

アンダーフローとは、浮動小数点数で表せる最小値よりさらに小さい値を扱おうとしたとき、その値が「0」として丸められてしまう現象のことです。

浮動小数点数(IEEE 754 単精度)では、ゼロより大きい最も小さい正の値は、おおよそ 1.4 × 10⁻⁴⁵ です。これより小さい正の値は表現する手段がないので、結果として 0 に置き換わります。

身近な例で考えると、ものさしの最小目盛より小さい長さは「0」と読むしかないのと同じです。コンピュータの「ものさし」(浮動小数点表現)にも目盛の限界があり、その下は測れません。

📌
発生条件

アンダーフローは「絶対値がとても小さい値を扱う」場面で発生します。典型例は次の3つです。

発生場面なぜ起きる対策
非常に小さい数の掛け算小さい数同士を掛けると、結果がさらに小さくなる対数空間で計算する(log を使う)
除算で小さい結果大きい数で小さい数を割ると極端に小さくなる順序を入れ替えて中間値を抑える
確率の積多数の小さい確率を掛け合わせると指数的に小さくなる対数を取って和に変換する

実務でよく目にするのは機械学習の確率計算です。たとえば100個の小さい確率(それぞれ0.01)を掛け合わせると、結果は 10⁻²⁰⁰。これは単精度では完全に0になります(倍精度でもギリギリ)。だから機械学習のコードでは「対数尤度(log-likelihood)」を使い、確率の積を対数の和に変換するのが定石です。

上のツールでスライダーを 1e-39 あたりまで下げると「非正規化数」の領域に入ります。ここでは値は表せますが、ケチ表現の「先頭の1」が使えなくなるので精度が落ちます。さらに 1e-46 以下になると、完全に0として扱われます。

📌
オーバーフローとの違い

アンダーフロー小さすぎ→0表現可能な範囲オーバーフロー大きすぎ→∞「表せる範囲」の両端でそれぞれ異なる現象が起きる

オーバーフローアンダーフローは対になる現象です。同じ「表現可能な範囲を超える」問題でも、超え方が逆向きです。

違いの整理:
オーバーフロー: 絶対値が大きすぎて表せない → 通常は ∞(無限大)として扱われる
アンダーフロー: 絶対値が小さすぎて表せない → 通常は 0 として丸められる
・どちらも計算精度が失われる点では同じだが、結果が出る方向が異なる

ポイントの整理:
・アンダーフローが発生するのは、表現範囲の下限を下回るとき
・オーバーフローとの違いは、大小の向きが逆で、結果の振る舞いも異なる点
・対策としては、対数空間での計算、スケール変更、より精度の高い型への切り替えなどがある

上のツールで 1e-50 を選ぶと、値は完全に0として処理されます。「データが存在したのに消えてしまう」──これがアンダーフローの怖さです。整数のオーバーフローほど目立つエラーにならないため、気づかずバグを見落とすこともあります。

関連コンテンツ