使 C 浮点文字浮动(而不是双精度)
Make C floating point literals float (rather than double)
众所周知,在 C 中,浮点字面量(例如 1.23
)的类型为 double
。因此,任何涉及它们的计算都会被提升为双倍。
我正在开发一个嵌入式实时系统,该系统具有仅支持单精度 (float
) 数字的浮点单元。我所有的变量都是float
,这个精度就够了。我根本不需要(也负担不起)double
。但是每次
if (x < 2.5) ...
写着,灾难发生了:减速可能高达两个数量级。当然直接回答就是写
if (x < 2.5f) ...
但这很容易被遗漏(并且很难检测到,直到为时已晚),尤其是当 'configuration' 值被 #define
放在单独的文件中时新)开发人员。
那么,有没有办法强制编译器将所有(浮点)文字都视为浮点数,就像带有后缀 f
一样?即使它违反规格,我也不在乎。或任何其他解决方案?顺便说一下,编译器是 gcc。
-fsingle-precision-constant
标志可以使用。它会导致以单精度加载浮点常量,即使这不是精确的。
注意 - 这也将在双精度变量的运算中使用单精度常量。
改为使用警告:-Wdouble-promotion
警告关于 隐式 浮点数加倍提升,如您的示例所示。 -Wfloat-conversion
将警告您可能仍在将双精度分配给浮点数的情况。
这是一个比简单地将双精度值强制为最接近的浮点值更好的解决方案。您的浮点代码仍然是合规的,如果双精度值具有正值,例如小于 FLT_DENORM_MIN
(假设 IEEE-754)或大于 FLT_MAX
,您将不会得到任何令人讨厌的惊喜.
您可以将定义的常量转换为 (float)
无论它们在哪里使用,优化器都应该完成它的工作。这是一个便携式解决方案。
#define LIMIT 2.5
if (x < (float)LIMIT) ...
-Wunsuffixed-float-constants
标志也可以使用,可能与上面接受的答案中的一些其他选项结合使用。但是,这可能无法捕获系统 headers 中未添加后缀的常量。也需要使用 -Wsystem-headers
来捕获它们。可能会产生很多警告...
众所周知,在 C 中,浮点字面量(例如 1.23
)的类型为 double
。因此,任何涉及它们的计算都会被提升为双倍。
我正在开发一个嵌入式实时系统,该系统具有仅支持单精度 (float
) 数字的浮点单元。我所有的变量都是float
,这个精度就够了。我根本不需要(也负担不起)double
。但是每次
if (x < 2.5) ...
写着,灾难发生了:减速可能高达两个数量级。当然直接回答就是写
if (x < 2.5f) ...
但这很容易被遗漏(并且很难检测到,直到为时已晚),尤其是当 'configuration' 值被 #define
放在单独的文件中时新)开发人员。
那么,有没有办法强制编译器将所有(浮点)文字都视为浮点数,就像带有后缀 f
一样?即使它违反规格,我也不在乎。或任何其他解决方案?顺便说一下,编译器是 gcc。
-fsingle-precision-constant
标志可以使用。它会导致以单精度加载浮点常量,即使这不是精确的。
注意 - 这也将在双精度变量的运算中使用单精度常量。
改为使用警告:-Wdouble-promotion
警告关于 隐式 浮点数加倍提升,如您的示例所示。 -Wfloat-conversion
将警告您可能仍在将双精度分配给浮点数的情况。
这是一个比简单地将双精度值强制为最接近的浮点值更好的解决方案。您的浮点代码仍然是合规的,如果双精度值具有正值,例如小于 FLT_DENORM_MIN
(假设 IEEE-754)或大于 FLT_MAX
,您将不会得到任何令人讨厌的惊喜.
您可以将定义的常量转换为 (float)
无论它们在哪里使用,优化器都应该完成它的工作。这是一个便携式解决方案。
#define LIMIT 2.5
if (x < (float)LIMIT) ...
-Wunsuffixed-float-constants
标志也可以使用,可能与上面接受的答案中的一些其他选项结合使用。但是,这可能无法捕获系统 headers 中未添加后缀的常量。也需要使用 -Wsystem-headers
来捕获它们。可能会产生很多警告...