私は次のような教科書を読んでいます。
C++ は、プログラムのソース コードに入力するすべての浮動小数点数 (7.33 や 0.0975 など) をデフォルトで double 値として扱います。
これは少し奇妙で、聞いたことがありません。無駄に見える?指定しないのに、なぜ余分な精度が得られるのでしょうか? 同じことを意味する 2 つの異なる型があるのはなぜですか? ロングダブルはどうですか?
私は次のような教科書を読んでいます。
C++ は、プログラムのソース コードに入力するすべての浮動小数点数 (7.33 や 0.0975 など) をデフォルトで double 値として扱います。
これは少し奇妙で、聞いたことがありません。無駄に見える?指定しないのに、なぜ余分な精度が得られるのでしょうか? 同じことを意味する 2 つの異なる型があるのはなぜですか? ロングダブルはどうですか?
これは言語仕様の一部です。double が必要な場合は、次のように記述します。
auto a = 12.3;
float が必要な場合は、次のように記述します。
auto a = 12.3f;
long double が必要な場合は、次のように記述します。
auto a = 12.3L;
出典: MSDN
トピック全体は、章の C++ 標準で広範に説明されています2.14 Literals
。
これは、浮動小数点リテラルのみを参照しています。
これは、コードに記述した整数は常に (signed) として扱われると言っているのと同じですint
。これを変数に割り当てるとすぐに、変数の型が取得されます。
ただし、計算でスタンドアロンのリテラルを使用すると、その計算のリテラルの型が取得され、暗黙的な型変換がトリガーされる可能性があります。
float f = 3.141; // f is of type float, even though the literal was double
auto d = f * 2.0; // d will be of type double because of the literal 2.0
auto f2 = f * 2.0f; // f2 will be of type float again
2 行目の計算には 2 つの異なる型が含まれます。変数の型 f
は ですfloat
。double
リテラルから構築されたとしても、変数の型が重要です。一方、リテラル の型は であるため、計算の暗黙的な変換がトリガーされます。したがって、実際の乗算は 2の乗算として実行されます。2.0
double
double
スタンドアロンの値に特定の型を持たせたい場合は、一致するリテラルを使用します。