プログラムの数値計算で発生する誤差の種類 丸め誤差・打ち切り誤差・桁落ち
約 2 分
目次
概要
コンピュータで出てくる誤差はいくつかありますが、 それらをコードに落として整理しました。
はじめに
例えば 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
オーバーフローのエラーが出ます。
参考にしたサイト
おすすめの記事
最新の記事
よく読まれている記事
タグから探す
- javascript130
- typescript67
- node.js54
- linux54
- 画像処理48
- amazon-aws48
- アルゴリズム37
- canvas35
- html529
- 画像処理100本ノック27
- php24
- centos24
- python22
- 競技プログラミング21
- mac21
- mysql20
- opencv17
- 雑談16
- 機械学習16
- docker16
- wordpress15
- atcoder14
- apache12
- データベース12
- amazon-s312
- red-hat12
- prisma12
- ubuntu11
- github10
- git10
- react10
- mariadb10
- vue.js9
- next.js9
- aws-cdk9
- css38
- 可視化8
- 小ネタ8
- nestjs8
- amazon-lightsail7
- ブログ6
- cms6
- oracle6
- perl6
- gitlab6
- iam5
- amazon-ec25
- 資格試験5
- aws-amplify5
- curl4