競技プログラミング用 知識集積所
double型
最終更新:
sport_programming
-
view
雑な説明
小数型変数。
レベル
ABCのA問題レベル。
詳細な説明
64ビットの浮動小数点型。
符号用の1ビット、桁数用の11ビット、数の並び用の53ビット。
プラスマイナスそれぞれおよそ10^(-308)から10^308までと、0を表せる。
その範囲を逸脱することはまずないので、気にしなくてよい。
むしろ、値が約15桁の概数となってしまうため、そちらによる影響を気にするべきである。
符号用の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型を代入すると、その整数と同じ値の小数型が代入される。
数学とは違い、左右を逆にして b=a; と書くと意味が変わるので注意。
int型にdouble型を代入すると、小数点以下を切り捨てた値が代入される。
double型にint型を代入すると、その整数と同じ値の小数型が代入される。
加算 +
a+bで、aとbの和を計算する。
片方が整数型の場合も、答えはdouble型になる。
片方が整数型の場合も、答えはdouble型になる。
減算 -
a-bで、aとbの差を計算する。
片方が整数型の場合も、答えはdouble型になる。
片方が整数型の場合も、答えはdouble型になる。
乗算 *
a*bで、aとbの積を計算する。
片方が整数型の場合も、答えはdouble型になる。
片方が整数型の場合も、答えはdouble型になる。
除算(切り捨て) /
a/bで、aをbで割ったときの商を計算する。
片方が整数型でも、割り切れるまで割った値を出す。
片方が整数型でも、割り切れるまで割った値を出す。
各種複合代入演算子
複合代入演算子(未作成)を参照。
double型の場合、+=、-=、*=、/=、が使える。
double型の場合、+=、-=、*=、/=、が使える。
よく使う処理
固定小数表示で出力する。
double型をcoutする場合、通常は6文字以内で出力できない場合、1.2e+06のような表記で出力されるようになっている。
競プロでは桁数が多くてもちゃんと表示してほしいので、
競プロでは桁数が多くてもちゃんと表示してほしいので、
cout << fixed << a << endl;
とする。
この場合小数点以下6桁を出してくれるが、問題で6桁の精度が求められる場合、不安な場合は
この場合小数点以下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桁残しなどでも同様。
小数点以下3桁残しなどでも同様。
注意点
double型の==判定を信用してはいけない。
double型は概数で保持するため、末尾の数桁は不正確なことがある。
そのため、本来一致するはずの2つの値が一致しないことがある。
例えば、以下のコードは、実行するとNoと表示される。
そのため、本来一致するはずの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になるような事故も起こるので、バランスを取るのが難しい。
これを避ける場合に、非常に小さい値を足してから切り捨てる手法がある。
ただし、aの値の大きさによって、小さすぎると影響がなく、大きすぎると2.98が3.01になるような事故も起こるので、バランスを取るのが難しい。