C++ でフロートに常に接尾辞 'f' を使用する利点はありますか?
一方で、私のコードはめちゃくちゃになります。つまり、たくさんの数式があり、単純に 1 を書く代わりに 1.0f を書くことを想像してください。コードが乱雑になります。
しかし、これに最適化やその他の側面があるのだろうか?
ありがとう
C++ でフロートに常に接尾辞 'f' を使用する利点はありますか?
一方で、私のコードはめちゃくちゃになります。つまり、たくさんの数式があり、単純に 1 を書く代わりに 1.0f を書くことを想像してください。コードが乱雑になります。
しかし、これに最適化やその他の側面があるのだろうか?
ありがとう
場合によっては必要になります。
次の関数テンプレートを検討してください。
template<typename T>
void f(T a, T b);
float get_value(); //consider this too!
これを見てください:
f(get_value(), 1); //compilation error
f(get_value(), 1.0); //compilation error
f(get_value(), 1.0f); //okay
最初の 2 つの呼び出しでは、テンプレートの引数推定が失敗するため、コンパイルされません。ideoneで自分でエラーを確認してください。
1
の型がis int
、 and 1.0
is であるのdouble
に対し、1.0f
isであることに注意してくださいfloat
。
実行時のパフォーマンスが低下しないように、コンパイラはほぼ確実にそれを把握します。
明示的である理由は、暗黙的な変換に関するコンパイラの警告を回避するため、予期しない動作をする可能性のある変換を回避するため、型推定コンテキストで特定の型を推定するため、または特定のオーバーロードを強制的に呼び出すためです。
ソースが値を分数として表現したいが、リテラルの型が間違っているために間違った値を取得する例を次に示します。
float a = 3/4; // produces 0.0f instead of 0.75f
暗黙的な変換によって引き起こされる警告は次のとおりです。
tmp.cpp:4:15: warning: implicit conversion loses floating-point precision:
'double' to 'float' [-Wconversion]
float a = 0.1;
~ ^~~
具体的でないために発生するあいまいなオーバーロード エラーの例を次に示します。
tmp.cpp:6:5: error: call to 'foo' is ambiguous
foo(1);
^~~
tmp.cpp:2:6: note: candidate function
void foo(unsigned char a);
^
tmp.cpp:3:6: note: candidate function
void foo(float b);
^
1.0
または定数1.
_double
1.0f
float
定数です
違いがあります。
警告をなくすことができます。
ちなみに、コンパイラによっては、舞台裏で float が計算のために double に昇格されます。
double と float を指定するもう 1 つの用途は、FORTRAN の残り物であり、コンパイラを悩ませる場合もあれば、そうでない場合もあります。昔は、FORTRAN は指定した精度でデータを保存するだけで、最後の桁を超えた指定されていないバイトにごみを残していました。x = 1.0 をコーディングして、"x" のタイプ (FORTRAN では単精度浮動小数点数) によっては、x を 1.0987659987623 に等しくすることはかなり可能でした。