桁落ち【loss of significance】
概要

コンピュータでは実数を有限のビット数で表現するため、多くの数値は近似値として記録される。無限小数や桁数の多い小数を扱う場合、ある桁より下を四捨五入するなどして有限の桁数に丸めて表現することになり、この処理によって元の値との間にわずかな誤差(丸め誤差)が生まれる。
丸め誤差を含む値同士が極めて近い場合、その差を求める減算を行うと上位の桁が互いに打ち消し合い、結果として残るのは誤差を含んだ下位桁だけになる。これにより、結果の値は元の値に比べて極めて小さくなり、有効数字として意味を持つ桁数も大きく減少する。減算の対象となる2つの値が近いほど、この影響は大きくなる。
例えば、√100001-√100000という計算を有効数字8桁で行うと、0.31622935×10³-0.31622777×10³=0.158×10⁻²となり、計算前は8桁あった有効数字が3桁まで減少する。コンピュータの浮動小数点形式では、このように失われた下位の桁を0で埋め、便宜上0.15800000×10⁻²のような形で扱う。この0で埋められた部分は計算によって正しく導かれた値ではなく、見かけ上の桁数を保つための埋草に過ぎない。この値に大きな数を掛けるなど計算を続けると、桁落ちによって生じたわずかな誤差が拡大し、最終的な計算結果に大きな誤差として現れることがある。
桁落ちは加算や乗算、除算では発生せず、近い値同士の減算に特有の現象である。これを避けるため、数式を変形して近い値同士の減算を回避する方法が用いられる。例えば√100001-√100000 は、(√100001+√100000)/(√100001+√100000) を乗じて 1/(√100001+√100000) という形に書き換えると加算と除算だけになり桁落ちを起こしにくくなる。このほか、倍精度実数型など、より多くの桁数を扱えるデータ型を採用して計算精度自体を高めておく対策も取られる。