5.2 double型
小数について扱いたい時もあるだろう。小数はdouble型によって表される。
cpp
double y = 3.5;5.2.1 小数型に潜む罠
小数型は基本的に扱わない方が良いと言われている。以下のコードを見て欲しい。
cpp
double x = 0.1;
double y = 0.2;
double z = 0.3;
bool b = (x+y == z);
cout << b << endl;このコードの出力を考えて欲しい。明らかにtrueなはずである。 しかし、実際に実行してみると0(=false)と表示される。
これは簡潔に言ってしまえばdouble型は2進数の小数に近似する型だからである。
おそらく高校数学で勉強したと思うが、10進数の世界において 2 と 5 以外を因数に持つ整数で 1 を割った時、それは循環小数になる。 (例: )
コンピューターの扱う2進数の世界でも同じ事が言えて、2進数で0.1や0.2等の値は循環小数となる。 (例えば )
この時、コンピューターは小数をある程度の位で打ち切って、値を丸め込んで保存する。この時に誤差が発生してしまい、故に上記のコードは0(=false)を出力するのである。
その為に、小数値を使って正確な演算をするのは基本的には避けた方が良いと言われる。例えば単位の60点を超えているかどうかの判定で、60点ぴったりなはずだったのに誤差の関係で不合格と言われたらたまったものではない。(ゲーム製作においては座標計算の都合でどうしても小数を使うのだが…)
ちなみに、整数でデータを上手に持つ事で小数を正確に扱う方法もある。(例えば 分母と分子で2変数を持ってしまえば、有理数は常に正確に計算できる)。また、有理数・有限小数を正確に扱えるパッケージ(ライブラリ)も存在する。