浮動小数点定数浮動小数点定数浮動小数点定数浮動小数点定数浮動小数点定数浮動小数点定数浮動小数点定数浮動小数点定数浮動小数点定数浮動小数点定数浮動小数点定数浮動小数点定数浮動小数点定数浮動小数点定数浮動小数点定数は、デフォルトでdouble型です。Cで警告なしでfloat変数にdouble定数を代入しますか?
私はconst float pi = 3.1415
と警告しますが、実際はそうはありません。
私は-Wallとgccの下にこれらを試してみてください。
float f = 3.1415926;
double d = 3.1415926;
printf("f: %f\n", f);
printf("d: %f\n", d);
f = 3.1415926f;
printf("f: %f\n", f);
int i = 3.1415926;
printf("i: %d\n", i);
結果は次のとおりです。
f: 3.141593
d: 3.141593
f: 3.141593
i: 3
(ダブル変数を含む)の結果、明らかに精度を失うが、任意の警告なしにコンパイルします。
これでコンパイラは何をしましたか?または私は何かを誤解しましたか?
'printf'の可変性は渡されたときにfloatが暗黙的に倍精度にキャストされることを保証しますか? –
はい、それはむしろOPの質問には関係ありません。 –
私は、どちらが大きいのだろうと思います。「ダブルからフロートへの精度の低下の可能性がある」というミスの数、または明示的に多くのことを浮かべなければならないプログラマーが「フロート」するときのミスの数コンパイラがうまくいけば、またはなしてはいけない何かを '浮動させる 'ように強制する'const float oneTenth = 1.0f/10.0f; float value1 = 8.0f * oneTenth; double value2 = 4.0f * oneTenth; 'もし' oneTenth'が 'double'であったとすれば、すべてが完全に機能していたでしょう。 – supercat