使C浮点文字浮动(而不是双)

众所周知,在C中,浮点文字(例如1.23 )具有doubletypes。 因此,任何涉及他们的计算都会提升一倍。

我正在开发一个embedded式实时系统,它有一个浮点单元,它只支持单精度float 。 我所有的variables都是float ,这个精度就足够了。 我根本不需要(也买不起)。 但每次都是这样

 if (x < 2.5) ... 

写道,灾难发生:减速可能高达两个数量级。 当然,直接的答案是写

 if (x < 2.5f) ... 

但这很容易错过(而且很难检测,直到太晚),特别是当一个“configuration”值被一个不太严格的(或者是新的)开发者在一个单独的文件中定义的时候。

那么,是否有办法强制编译器将所有(浮点)文字视为float,就像后缀f ? 即使违反规范,我也不在乎。 还是其他解决scheme? 顺便说一句,编译器是gcc。

可以使用-fsingle-precision-constant标志。 它会导致浮点常量以单精度加载​​,即使这不正确。

注 – 这也将在双精度variables的操作中使用单精度常量。

使用警告,而不是: -Wdouble-promotion关于隐式浮动的警告来加倍提升,如你的例子。 -Wfloat-conversion会警告你可能仍然在分配双打的情况。

这是一个更好的解决scheme,而不是简单地将double值强制为最接近的浮点值。 你的浮点代码仍然是兼容的,如果一个double值持有一个正值,比如FLT_DENORM_MIN (假设为IEEE-754)或者大于FLT_MAX ,你就不会得到任何令人讨厌的惊喜。

您可以将定义的常量转换为(float) ,优化程序应该尽其所能。 这是一个便携式解决scheme。

 #define LIMIT 2.5 if (x < (float)LIMIT) ...