Cでは、浮動小数点リテラル(例:1.23
)タイプはdouble
です。結果として、それらを含む計算は2倍になります。
私は、単精度(float
)数値のみをサポートする浮動小数点ユニットを持つ組み込みリアルタイムシステムに取り組んでいます。私の変数はすべてfloat
であり、この精度で十分です。 double
はまったく必要ありません(または余裕もありません)。しかし、毎回何かのような
if (x < 2.5) ...
書かれていると、災害が発生します。スローダウンは最大2桁になる可能性があります。もちろん、直接的な答えは書くことです
if (x < 2.5f) ...
しかし、これは非常に見逃しやすい(そして、「設定」値が#define
'規律の低い(または単に新しい)開発者が別のファイルに入れた。
だから、コンパイラにすべての(浮動小数点)リテラルをサフィックスf
のようにフロートとして扱うように強制する方法はありますか?仕様に反しても、私は気にしません。または他の解決策はありますか?ところで、コンパイラはgccです。
-fsingle-precision-constant
フラグを使用できます。これにより、浮動小数点定数が正確ではない場合でも単精度でロードされます。
注-これは、倍精度変数の操作でも単精度定数を使用します。
代わりに警告を使用します。-Wdouble-promotion
は、例のようにimplicit floatをダブルプロモーションに警告します。 -Wfloat-conversion
は、floatにdoubleをまだ割り当てている場合について警告します。
これは、double値を最も近いfloat値に強制するよりも優れたソリューションです。浮動小数点コードは引き続き準拠しており、double値がFLT_DENORM_MIN
より小さい(IEEE-754を想定)またはFLT_MAX
より大きい正の値を保持している場合、意外な驚きはありません。 。
定義された定数は、(float)
にキャストすることができます。それらが使用されている場合は、オプティマイザーがその仕事をする必要があります。これはポータブルなソリューションです。
#define LIMIT 2.5
if (x < (float)LIMIT) ...
-Wunsuffixed-float-constants
フラグも使用でき、上記の受け入れられた回答の他のオプションのいくつかと組み合わせることができます。ただし、これはおそらくシステムヘッダーの接尾辞のない定数をキャッチしません。それらもキャッチするには、-Wsystem-headers
を使用する必要があります。多くの警告が生成される可能性があります...