目次> 第7章> 7.2 TOPUPPREVNEXT

7.2 まるめ(有限な桁で表すための限界)

浮動小数点は、有効数字(仮数部)と 桁移動(指数部)の組合せで、以下のような広い範囲の数を表現します。

サイズ指数部仮数部値の範囲
float 32ビット8ビット24ビット±3.40282347E+38 〜 ±1.40239846E-45
double64ビット11ビット53ビット±1.79769313486231570E+308 〜 ±4.94065645841246544E-324

float と double の有効数字の桁数を調べて見ましょう。

有効数字の桁数は、上記仮数部の桁数で決まります。 page-7-2-1.gif という関係に注目して概算をしてみると、

page-7-2-2.gif

10進数で数えて、float は7〜8桁、 double は 16桁程度の有効数字であることがわかります。

確認するプログラムを作ってみましょう。

浮動小数点で表現可能な絶対値の一番小さい数は、 Float.MIN_VALUE および Double.MIN_VALUE で参照できます。

判定アルゴリズム

  1. delta を最小値にする
  2. (0.1 + delta)0.1 を比較して、
  3. 等しかったら、 delta を10倍して 上記の 2. から繰り返し
  4. 差が出たらおわり

プログラム CompFloat4.java

実行結果
実行結果

double は 16桁まで、 float は 7桁まで正しい値になっています。

無限小数や循環小数(2進法の)となる数値を有限の桁で表現したり、 桁数が多く有効数字をすべて保持できない整数を表現したりする場合に 生ずる誤差をまるめ誤差といいます。 有効数字の桁数以内の整数であれば正確な値を保持できますが、 浮動小数点数は、一般には誤差を含むと考えなければいけません。 たとえば、
0.1 を10回たす 」のと、「 0.11.0 になるまで 何回か積算する 」のでは、結果が違います。

プログラム例 CompFloat1.java

実行結果
実行結果

また、上記の結果を見て、 0.9999999... を 1.0 と、  1.0999999... を 1.1  と 読めるようにしましょう。

 

2つの浮動小数点数が等しいかどうかの判定も工夫が必要です。 小数点以下の有効数字をもつ場合、計算結果が同じになることは稀です。

例: Error1.java

したがって、計算結果が等しいかどうかの判定には

といったような比較が必要となります。

大小比較も同じ問題が発生しますので、 まず上記のいずれかの方法で「等しい」場合を判定し、 それ以外の場合について 「 < 」 や 「 > 」 で判定するのがよいでしょう。


更新日:2012/04/02 TOPUPPREVNEXT