検索

キーワード


浮動小数点数の誤差について(無限小数・桁あふれ誤差・情報落ち・打切り誤差・桁落ち・丸め誤差)

  • 公開日:2021-03-31 17:38:19
  • 最終更新日:2021-03-31 17:37:46
浮動小数点数の誤差について(無限小数・桁あふれ誤差・情報落ち・打切り誤差・桁落ち・丸め誤差)

2進数を浮動小数点数で表現する際、決まっているビットに入りきらない数が出て、誤差が生じることがありえます。


この記事を読むことで、

・浮動小数点数の誤差

・桁あふれ誤差

・情報落ち

・打ち切り誤差

・丸め誤算

・桁落ち


以上のことが分かります。


この記事では、浮動小数点数を知っている方に向けたものとなっています。

浮動小数点数について詳しく知りたい方は、

2進数の小数点(固定小数点数・浮動小数点数)の表し方と正規化について

をご一読ください。


また、基数・進数・桁の重みについてより詳しく知りたい方は、

基数とは?IT系国家試験の基本知識、2進数について解説

をご一読ください。基数についてより知ることができます!




浮動小数点数の誤差

パソコンの写真

コンピュータでは、表現できる数値は8ビット、32ビット64ビットなどとなっています。

表現できる数値は、決まっているビット内のみの範囲となるため、例えば16ビットで表現するところ2進数の17桁で表してほしい!と思っても範囲を超えるため、17桁の2進数を表すことは16ビットではできません。

また、割り算をして、割り切れない数値が解だとした場合、誤差が発生してしまいます。

例えば、10進数の10÷3で見てみましょう。

10÷3=3.33333…


このように永遠と3が続いてしまう状況にある数値を無限小数と言います。

表現できるビット数は限られているので、例えば8ビットで表現する場合、8ビット以下の数値は切り捨てされてしまうかもしれず、正確な数値とは言えません。

また、10進数「0.1」を2進数に変換しようとした場合、

0.0001100110011…


と終わりが見えず、有効桁がきまっていると、どこかで切らなくてはいけません。


そのため、コンピュータではこのように終わりがない数値や有効桁を超えてしまう数値に対しては、正確な数値に一番近くなるような数値を出しているのです。

電卓で計算した場合も、同じように割り切れない場合や、表示できる桁を超えてしまう場合には、一番近い数値を表示しているのと同じです。


また、コンピュータでは、どんな時にどういった誤差が生じるかを5つに分類しています。

・桁あふれ誤差

・情報落ち

・打ち切り誤差

・丸め誤算

・桁落ち




桁あふれ誤差(オーバーフロー・アンダーフロー)

桁あふれ誤差とは、演算結果の値が、コンピュータが表現できうる有効桁の範囲の最大値や最小値(上限や下限)を超えてしまうことにより生じる誤差を言います。

桁あふれ誤差で有効桁の範囲の最大値(上限)を超えることを「オーバーフロー」

桁あふれ誤差で有効桁の範囲の最小値(下限)を超えることを「アンダーフロー」


と呼びます。


例えば4桁まで表示できる電卓があるとします。

この電卓で「9999」よりも演算結果が大きい場合の誤差が「桁あふれ誤差(オーバーフロー)」になります。

逆に「0.00…01」のように小さすぎる(0に近い数)場合の誤差が「アンダーフロー」になります。


オーバーフロー・アンダーフロー図


絶対値で大きすぎる場合発生するのがオーバーフローで、

絶対値で小さすぎる(0に近い数)場合発生するのがアンダーフローです。


また、固定小数点数で最小と最大を超えた場合(8ビットの場合)は


正・負のオーバーフロー図


となります。




情報落ち

情報落ちとは、絶対値の大きな数値と絶対値のとても小さな数値との演算によって、絶対値のとても小さな数値が、計算結果に反映されないことにより生じる誤差を言います。


例えば4桁まで表示できる電卓があるとします。

1000-0.001

=999.999

上記の計算を4桁電卓で行った場合、

解の999.999は有効桁の範囲が4桁のため、

1000-0.001

=1000(0.999が無視されてしまう)

となってしまうのです。

この小さな数値が結果に反映されないことを「情報落ち」と言います。


また、仮数部が4桁の10進数で正規化をした場合を例に上げてみます。


(0.1234×10²)+(0.1234×10⁻²)


指数を揃えます。


情報落ち


仮数部の有効桁の範囲は4桁のため、

0.00001234は無視され、なかったことにされてしまいました。

浮動小数点数で、小さな数値が結果に反映されないことがあることが分かりました。この反映されない小さな数字が「情報落ち」です。




打切り誤差


打切り誤差とは、コンピュータでの計算処理を完了を待たず途中で打ち切ることにより生じる誤差のことです。


例えば、10進数の10÷3で見てみましょう。

10÷3=3.33333…


このように無限小数となってしまう数値に対し、永遠と計算をし続けることはできないので、途中で計算を打ち切らなくてはいけません。

本当は3.3333333…という結果なのに対し、計算を途中で打ち切り3.333という数値になった場合に実際の結果と打ち切った結果で誤差が生じてしまいます。

この誤差が「打切り誤差」です。


円周率も永遠に終わらない数値として有名です。

3.14159265359…

この場合も「3.14」など途中で計算を打ち切っているので、正確な円周率との間に生じる誤差も「打切り誤算」となります。




丸め誤算

丸め誤算とは、有効桁数を超えてしまい、最小桁より小さい部分を四捨五入や切り上げ、切り捨てなどを行って表示することで生じる誤差のことです。


例えば、10進数「0.1」を2進数に変換しようとした場合、

0.0001100110011…


と終わりが見えない無限小数となってしまうため、表現できる有効な桁が小数点以下8桁だとすると、

0.00011001


と、表現できる有効桁以降を切り捨てて表示します。


表現できる有効桁以降の値を四捨五入・切り上げ・切り捨てなどをして削った(丸めた)時、本当の数値と削った数値との間に生じる誤差が「丸め誤差」になります。




桁落ち

桁落ちとは、絶対値がほぼ等しい数値同士の引き算をした時に、有効桁数が大きく減ることによって生じる誤差のことです。


桁落ち


正規化をすることによって、有効桁数が増える物の自動で付けられた“00”は、本当に正しい数値なのか保証ができない=信用できないのです。





まとめ

浮動小数点数の誤差について分かったでしょうか?

どう違うのかがこんがらがってしまいやすいですが、

1つずつ押さえていくことで、覚えやすくなるはずです。




【著者】

伊藤

Javaを研修で3か月学んだ、駆け出しのエンジニアです。
現在は、ベンダー資格を取得するため、勉強を日課にできるよう努力中です。

よく読まれている記事