競技プログラミング用 知識集積所

double型

最終更新:

sport_programming

- view
管理者のみ編集可


雑な説明

小数型変数。

レベル

ABCのA問題レベル。

詳細な説明

64ビットの浮動小数点型。
符号用の1ビット、桁数用の11ビット、数の並び用の53ビット。
プラスマイナスそれぞれおよそ10^(-308)から10^308までと、0を表せる。
その範囲を逸脱することはまずないので、気にしなくてよい。
むしろ、値が約15桁の概数となってしまうため、そちらによる影響を気にするべきである。

整数を小数型として扱いたい場合、2.0のように書けばdouble型の2となる。

宣言と初期化

宣言だけする場合
double a;
初期化もする場合
double a = 0.0;  //固定値で初期化、0とだけ書いてもキャストされるので問題ない
double b = a;    //他の変数(整数型、double型)で初期化

可能な演算

代入 =

a=b; で、変数aの中身をbという値に書き換える。
数学とは違い、左右を逆にして b=a; と書くと意味が変わるので注意。
int型にdouble型を代入すると、小数点以下を切り捨てた値が代入される。
double型にint型を代入すると、その整数と同じ値の小数型が代入される。

加算 +

a+bで、aとbの和を計算する。
片方が整数型の場合も、答えはdouble型になる。

減算 -

a-bで、aとbの差を計算する。
片方が整数型の場合も、答えはdouble型になる。

乗算 *

a*bで、aとbの積を計算する。
片方が整数型の場合も、答えはdouble型になる。

除算(切り捨て) /

a/bで、aをbで割ったときの商を計算する。
片方が整数型でも、割り切れるまで割った値を出す。

各種複合代入演算子

複合代入演算子(未作成)を参照。
double型の場合、+=、-=、*=、/=、が使える。

よく使う処理

固定小数表示で出力する。

double型をcoutする場合、通常は6文字以内で出力できない場合、1.2e+06のような表記で出力されるようになっている。
競プロでは桁数が多くてもちゃんと表示してほしいので、
cout << fixed << a << endl;
とする。
この場合小数点以下6桁を出してくれるが、問題で6桁の精度が求められる場合、不安な場合は
cout << fixed << setprecision(10) << a << endl;;
などとすれば小数点以下の桁数を指定することができる。

整数型の割り算を割り切れるまで行う

整数型同士の割り算は、通常は商と余りを出す。
そうではなく小数になっても割り切ってほしい場合は、
1.0*a/b
と書けばよい。
あるいは、定数で割る場合は
a/10.0
のように書いてもよい。

小数点以下の切り捨て、切り上げ、四捨五入

それぞれ、floor(a)、ceil(a)、round(a)、で求められる。

小数点以下1桁残しての切り捨て、切り上げ、四捨五入

10で割って、切り捨てなどをして、10倍する。
小数点以下3桁残しなどでも同様。

注意点

double型の==判定を信用してはいけない。

double型は概数で保持するため、末尾の数桁は不正確なことがある。
そのため、本来一致するはずの2つの値が一致しないことがある。
例えば、以下のコードは、実行するとNoと表示される。
double a = 4.1;
double b = 3.1;
double c = 1.0;
if (a-b==c) cout << "Yes" << endl;
else cout << "No" << endl;
可能な限り整数型で判断できる方法を考えた方が安全。

切り捨て時に誤差が発生することがある。

本来ぴったり3のときに、中身が2.9999999999とかになっていて、切り捨てで2にされる可能性がある。
これを避ける場合に、非常に小さい値を足してから切り捨てる手法がある。
ただし、aの値の大きさによって、小さすぎると影響がなく、大きすぎると2.98が3.01になるような事故も起こるので、バランスを取るのが難しい。

関連アルゴリズム

ウィキ募集バナー