floatやdoubleの落とし穴

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

プログラミング言語においては、小数を扱う場合、一般的にはfloat型やdouble型を使うことが多い。多くの場合はfloat型やdouble型を使うことで問題ないのだが、実はそれらを使ってはいけない場面もしばしばある。

floatやdoubleは、「浮動小数点数」と呼ばれるもので、「符号」と「仮数」、「指数」の組み合わせで小数を表現している。

コンピューターにおいては、基本的には0と1からなる二進数の組み合わせで全てを表現しており、それを念頭に入れる必要がある。実のところ、C/C++における整数型には気をつけよでも変数のサイズについて扱っているが、これはfloatやdoubleでも応用が効く。

なお、浮動小数点数では、一般的な環境(IEEE 754)では以下のようにビットサイズが定義されている。

浮動小数点数型 符号部 仮数部 指数部 合計
float (単精度) 1 8 23 32
double (倍精度) 1 11 52 64

これによって、大きな数になると誤差が生じるなどの問題もあるが、科学計算など極端に大きな数を扱う分野などで一定の誤差が要因される場合はしばしば用いられる。

一方で、これによって、比較演算の際には誤差が生じる問題を考慮した上で実装しなければならないという落とし穴も生じる。

したがって、金融計算など誤差を容認できない場合はfloatやdoubleを使うことはできない。誤差を容認できない場合は、10進表現の扱える小数点数型あるいはオブジェクトを用いる必要がある。

これを言語レベルで扱っている言語は決して多いわけではなく、例えばC言語やC++では標準では搭載されていないため、外部のライブラリーを導入する必要がある。JavaではBigDecimalがあるが、あくまでオブジェクトの扱いであるため、計算の際は演算式ではなく、メソッドを使わなければならないなどの不便を強いられることもある。ただし、割り切れる数であれば、多くの場合は10進数の計算が可能になるため、正確な数値が必要な場合はこれを使う必要がある。

floatやdoubleはよく使われるが、分野によっては落とし穴になるものであるため、気をつけて使っていきたい。

タイトルとURLをコピーしました