プログラムの数値計算で発生する誤差の種類 丸め誤差・打ち切り誤差・桁落ち
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
(110)
(54)
(54)
(47)
(45)
(36)
(30)
(29)
(24)
(24)
(22)
(21)
(21)
(20)
(19)
(17)
(16)
(16)
(15)
(14)
(12)
(12)
(12)
(12)
(12)
(12)
(11)
(10)
(10)
(10)
(10)
(10)
(9)
(9)
(8)
(8)
(8)
(8)
(7)
(7)
(6)
(6)
(6)
(6)
(6)
(5)
(5)
(5)
(5)
(4)
Author