
プログラムの数値計算で発生する誤差の種類 丸め誤差・打ち切り誤差・桁落ち
2021-02-093 min read
目次
概要
コンピュータで出てくる誤差はいくつかありますが、 それらをコードに落として整理しました。
はじめに
例えば 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
オーバーフローのエラーが出ます。
参考にしたサイト
Recommends
New Posts
Hot posts!
Date
Tags
Author