10進数で下記のような計算をするとします。
1 / 3 = 0.3333333333333333333333.....
上記を無限小数と呼びます。
実際の数値と、コンピュータ内部で表現できる数値との間に生じたずれを、誤差と呼びます。
誤差といっても種類があるようなので見ていきます。
けたあふれ誤差
演算した結果が、コンピュータの扱える最大値や最小値を超えることによって生じる誤差がけたあふれ誤差となります。
| 表現できる範囲 |
数値------------------------→
MIN MAX
最小値を超えてしまうことをアンダーフロー
最大値を超えてしまうことをオーバーフロー
と呼びます。
僕の頭は常にオーバーフローです。
0.000000000000000000000001
浮動小数点数の指数部がパンクして精度が保てない時にアンダーフローが起きるらしいです。
情報落ち
絶対値の大きな値と絶対値の小さな値の力加減を行った時に、絶対値の小さな値が
計算結果に反映されないことによって生じる誤差が情報落ちとなります。
仮数部を4けたであらわす浮動小数点数があったとすると
符号 指数部 仮数部
下記の足し算をすると
0.1234 * 10⁴ + 0.4321 * 10⁻⁴
計算するには指数を揃える必要があります。
0.1234 * 10⁴
+ 0.000000004321 * 10⁴
-----------------------
0.123400004321 * 10⁴
浮動小数点数のため正規化をします。
0.1234 * 10⁴
打切り誤差
計算処理を完了まで待たずに途中で打ち切ることによって生じる誤差が打ち切り誤差
例えば
3.14159265358979323846....
N桁で終わり!と途中で打ち切ると数に誤差が出ます。
その誤差のことです
けた落ち
絶対値がほぼ等しい数同士の差を求めた時に、有効なけた数が大きく減ることによって生じる誤差がけた落ちです
0.556 * 10⁷
0.552 * 10⁷
0.004 * 10⁷
// 正規化されると0が自動で付加されるが
0.400 * 10⁵
↑
この桁が正規化する際に、元々0だったという保証がない
信用できないけたが増えるとのことです。
丸め誤差
表現できる桁数を超えてしまったため、最小桁より小さい部分について、四捨五入や切上げ、切捨てなどを行うことによって生じる誤差が丸め誤差です
1.100110011001100110011001100
1.10011001100110011001100✖︎✖︎✖︎✖︎
// 捨てられた数の分だけ誤差がでます
まとめ
この辺りは暗記ですね。
誤差ばかり見ていたので、自分の現実と理想の誤差を考えますね。