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

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可以使用标志.它会导致浮点常量以单精度加载​​,即使这不是精确的.

注意 - 这也将在双精度变量的操作中使用单精度常量.

  • 谢谢!我不知道这面旗帜.这完全回答了我的问题 - 尽管正如其他建议的那样,产生警告可能会更加谨慎. (2认同)
  • 我会明智地使用这个选项!考虑一个新的开发人员,只需输入 `x &lt; 2.5`,一切都会好起来的。他很可能会错过挽救他生命的特定编译器选项:-)。当他收到警告时(使用 `-Wdouble-promotion`、`-Wfloat-conversion`),而您使用 `-Werror` 将所有警告转换为错误时,他可能不会直接检入代码,并且可能会怀疑,并且学习。但只是为了发布质量,您可能希望安全起见,并使用特定选项(`-fsingle-precision-constant`)编译它。请注意,这只是一个评论。 (2认同)

Bre*_*ale 50

请改用警告:-Wdouble-promotion警告隐式浮动到双重促销,如您的示例所示.-Wfloat-conversion将警告你可能仍在为浮动分配双打的情况.

这是一个比简单地将双值强制转换为最接近的浮点值更好的解决方案.您的浮点代码仍然符合要求,如果双值保持正值(例如,小于FLT_DENORM_MIN(假设为IEEE-754)或大于),则不会产生任何令人讨厌的意外FLT_MAX.

  • 我也相信使用命令开关隐藏源代码中的问题是危险的.考虑到你的代码可能会被其他人使用五年后使用新版本的编译器,也许没有那个整洁的开关.更好地解决源代码中的问题而不是隐藏它们.关于所有这些警告......在编译生产时,警告应被视为错误. - 错误:-) (2认同)