プログラムの数値計算で発生する誤差の種類 丸め誤差・打ち切り誤差・桁落ち

プログラムの数値計算で発生する誤差の種類 丸め誤差・打ち切り誤差・桁落ち

2021-02-093 min read

目次

  1. 概要
  2. はじめに
  3. 誤差の種類
  4. 参考にしたサイト

概要

コンピュータで出てくる誤差はいくつかありますが、 それらをコードに落として整理しました。

はじめに

例えば 2/3の計算の答えは 0.66666666666... と永遠に数字が続きますが、 プログラムで表現できる数値には限界があります。

例えば jsの場合は以下の結果のように16桁までしか表示できません。

> 1/3
0.3333333333333333

このように実際の数値と計算機で表現できる値の差を「誤差」と呼びますが、 誤差の種類を整理してまとめました。その際の記録です。

誤差の種類

誤差の種類については次のようなものがあります。

  • 丸め誤差
  • 打ち切り誤差
  • 桁落ち
  • 情報落ち
  • 桁溢れ誤差 (オーバーフロー、アンダーフロー)

これらの誤差をコードベースに落としてみます。

丸め誤差

表現できる桁数を切り上げ・切り捨てなどを行うことで生じる誤差です。

> 2/9
0.2222222222222222

打ち切り誤差

計算処理を完了まで待たずに打ち切る誤差です。

> 44 / 79
0.5569620253164557

桁落ち

絶対値が等しい数値の差を求めた時に有効な桁数が減少する誤差

123.456 - 123.444 = 0.012

情報落ち

絶対値が大きく異なる数を足したり引いたりすることで、小さい方の情報が無視されてしまう誤差

> 1919894334 - 0.000000003
1919894334

桁溢れ誤差

システムで扱える最大値や最小値を超えることで生じる誤差です。 最大値を超える場合はオーバフロー、最小値を下回る場合はアンダーフローと言われます。

例えばrustの場合

fn main() {
    let a: u8 = 200;
    let b: u8 = 100;
    let c: u8 = a + b;
    println!("{}", c);
}

を実行すると

5 |     let c: u8 = a + b;
  |                 ^^^^^ attempt to compute `200_u8 + 100_u8`, which would overflow

オーバーフローのエラーが出ます。

参考にしたサイト

誤差 - wikipedia

Author
githubzennqiita
ただの備忘録です。

※外部送信に関する公表事項