Zeu*_*eus 70 c floating-point gcc literals
众所周知,在C中,浮点文字(例如1.23
)具有类型double
.因此,任何涉及它们的计算都会提升到两倍.
我正在研究一个嵌入式实时系统,它有一个浮点单元,只支持单个precision(float
)数字.我的所有变量都是float
,这个精度就足够了.我根本不需要(也买不起)double
.但每次都喜欢
if (x < 2.5) ...
Run Code Online (Sandbox Code Playgroud)
写的,灾难发生:减速可以达到两个数量级.当然,直接的答案是写
if (x < 2.5f) ...
Run Code Online (Sandbox Code Playgroud)
但这很容易被遗漏(并且直到太晚才难以发现),尤其是当一个"配置"值被#define
一个不那么自律(或刚刚开发)的开发人员放在一个单独的文件中时.
那么,有没有办法强制编译器将所有(浮点)文字视为float,就像使用后缀一样f
?即使它违反了规范,我也不在乎.或任何其他解决方案?顺便说一句,编译器是gcc.
ame*_*yCU 78
-fsingle-precision-constant
可以使用标志.它会导致浮点常量以单精度加载,即使这不是精确的.
注意 - 这也将在双精度变量的操作中使用单精度常量.
Bre*_*ale 50
请改用警告:-Wdouble-promotion
警告隐式浮动到双重促销,如您的示例所示.-Wfloat-conversion
将警告你可能仍在为浮动分配双打的情况.
这是一个比简单地将双值强制转换为最接近的浮点值更好的解决方案.您的浮点代码仍然符合要求,如果双值保持正值(例如,小于FLT_DENORM_MIN
(假设为IEEE-754)或大于),则不会产生任何令人讨厌的意外FLT_MAX
.