web-dev-qa-db-ja.com

C浮動小数点リテラルを浮動小数点にする(二重ではなく)

Cでは、浮動小数点リテラル(例:1.23)タイプはdoubleです。結果として、それらを含む計算は2倍になります。

私は、単精度(float)数値のみをサポートする浮動小数点ユニットを持つ組み込みリアルタイムシステムに取り組んでいます。私の変数はすべてfloatであり、この精度で十分です。 doubleはまったく必要ありません(または余裕もありません)。しかし、毎回何かのような

if (x < 2.5) ...

書かれていると、災害が発生します。スローダウンは最大2桁になる可能性があります。もちろん、直接的な答えは書くことです

if (x < 2.5f) ...

しかし、これは非常に見逃しやすい(そして、「設定」値が#define '規律の低い(または単に新しい)開発者が別のファイルに入れた。

だから、コンパイラにすべての(浮動小数点)リテラルをサフィックスfのようにフロートとして扱うように強制する方法はありますか?仕様に反しても、私は気にしません。または他の解決策はありますか?ところで、コンパイラはgccです。

70
Zeus

-fsingle-precision-constant フラグを使用できます。これにより、浮動小数点定数が正確ではない場合でも単精度でロードされます。

注-これは、倍精度変数の操作でも単精度定数を使用します。

77
ameyCU

代わりに警告を使用します。-Wdouble-promotionは、例のようにimplicit floatをダブルプロモーションに警告します。 -Wfloat-conversionは、floatにdoubleをまだ割り当てている場合について警告します。

これは、double値を最も近いfloat値に強制するよりも優れたソリューションです。浮動小数点コードは引き続き準拠しており、double値がFLT_DENORM_MINより小さい(IEEE-754を想定)またはFLT_MAXより大きい正の値を保持している場合、意外な驚きはありません。 。

50
Brett Hale

定義された定数は、(float)にキャストすることができます。それらが使用されている場合は、オプティマイザーがその仕事をする必要があります。これはポータブルなソリューションです。

#define LIMIT 2.5

if (x < (float)LIMIT) ...
1
Yves Daoust

-Wunsuffixed-float-constantsフラグも使用でき、上記の受け入れられた回答の他のオプションのいくつかと組み合わせることができます。ただし、これはおそらくシステムヘッダーの接尾辞のない定数をキャッチしません。それらもキャッチするには、-Wsystem-headersを使用する必要があります。多くの警告が生成される可能性があります...

1
delsauce