コンピュータの処理能力は有限です。これを最大限に活用するために仕方なく生じる誤差があります。コンピュータを使う我々は,
それはちょうど,
道具は使いやすさのために,
浮動小数点数で発生するエラーや誤差
浮動小数点数の仕組み上避けられないエラーや誤差には次に挙げるものがあります。
- オーバーフロー/
アンダーフロー - 桁落ち
- 丸め誤差
- 情報欠落
- 打ち切り誤差
今回はこのうち
丸め誤差
丸め誤差とは,
丸め誤差は,
コンピュータ内部で数値は2進数で表現されているため,
IEEE754で規定された丸めのルールには,
- 最近値
(最も近い値に丸める) Round to Nearest - 上向き丸め
(正の無限大側の値に丸める) Round to Plus ∞ - 下向き丸め
(負の無限大側の値に丸める) Round to Minus ∞ - 切り捨て
(絶対値が小さい側の値に丸める) Round to Zero
Java 言語ではこれらのうち最近値
たとえば,
(0.
float 型にこの値を格納する際には,
V1 = (0 0111 1010 100 1100 1100 1100 1100 1100)B (0x3d4c cccc)H
V2 = (0 0111 1010 100 1100 1100 1100 1100 1101)B (0x3d4c cccd)H
真の値VPは(0x3d4c cccc ・ ・ ・
こうして真の値VPはV2により近いことがわかります。Java言語はこのようにして最も近い値を選択しているのです
float型は10進数にして8桁,
- ※1)
- 丸めといって混同しやすいのは実数値を整数型変数に代入したときに起こる小数部分の欠落や,
Math. round メソッドによる丸めです。これらは今回学習する丸めとは異なります。 - ※2)
- 例外として,
の数列を加算して得られる10進数の小数値のみは等価な2進数に変換が可能です。例(0.
625)D=(0. 101)B - ※3)
- 第8回の問題で作成したプログラムを使って,
0. 05の16進数表示を行い結果を確認してみましょう。 - ※4)
- この手口は,
サラミソーセージを一本丸ごと盗むとばれますが, スライスしてあるサラミソーセージのうちの一枚を盗んでも気がつかれないことに例えられ, サラミ法と呼ばれます。