使C浮点文字浮动(而不是双)
众所周知,在C中,浮点文字(例如1.23
)具有double
types。 因此,任何涉及他们的计算都会提升一倍。
我正在开发一个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) ...