- 数値計算
システム開発で避けるべき計算誤差たち
- 数値計算

計算誤差とは
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
計算機による数値計算の結果が、理論的な値と異なることを計算誤差といいます。システム開発において計算結果が予想と異なるケースがたまにありますが、小数点を含む計算や厳密さの問われる金額の計算などで発生しないよう、実装者は常に気を付ける必要があります。本記事では、よくある誤差とその原因について解説します。
丸め誤差
計算機は、実数を浮動小数点として計算しています。浮動小数点とは、実数を2進数(ないしは16進数)で表現した数字です。計算機では、数字の表現に使用できるメモリが有限のため、正確に浮動小数点に表現することができません。このように発生する誤差を丸め誤差と呼びます。計算機が区別できる、1より大きい最小の値と1との差をマシンイプシロンと呼び、マシンイプシロンが小さいと丸め誤差が小さくなります。
桁落ち
上位桁が同じ2つの数の差を計算するとき、有効桁が小さくなることを桁落ちといいます。例として2次方程式の解について考えてみましょう。解の公式は
で表されます。このとき、|b|が|a|、|c|に比べて非常に大きい場合は、
となり分子を計算するときに、有効桁数が小さくなってしまいます。
このことを避けるには、桁落ちが発生しないような解の求め方を探す必要があります。今回の場合では、解と係数の関係式を利用する方法や、解の公式を有理化するなどで対応することができます。
情報落ち
絶対値が大きく異なる2数の和をとると、小さいほうの値の影響が消えることがありますが、これを情報落ちといいます。マシンイプシロン未満の数字が計算時に反映されなくなるため、こちらも実装時に気を付ける必要があります。2数の和の場合は対応が難しいですが、絶対値が大きく異なる複数個の値の和を計算するときは、小さいほうの値から順に足していくとうまくいくことがあります。
打切り誤差
無限に続く計算(無限級数など)をしたくても、無限に計算はできないため、どこかで計算を打ち切る必要があります。これを打切り誤差といいます。システム開発においては、ほとんど見かけない誤差かもしれません。
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>