use*_*603 5 c floating-point gcc c89
我们有2个嵌入式项目.其中一个是使用宇宙编译器,另一个是使用GCC.两者都遵守ISO/IEC 9899:1990.
当我们使用文字14.8f初始化一个浮点数时,它会被转换为宇宙编译器上的0x416CCCCC和GCC的0x416CCCC的二进制表示.
第6.2.1.4章中的IEC标准浮动类型状态:
If the value being converted is in the range of values that can be represented but
cannot be represented exactly, the result is either the nearest higher or nearest lower value, chosen in an implementation-defined manner.
Run Code Online (Sandbox Code Playgroud)
因为我们使用这些数字作为阈值,这显然有所不同.宇宙编译器声明它使用向下舍入实现.由于GCC非常复杂,我想知道它是否有一个允许在编译时选择行为的编译器标志.到目前为止,我只发现您可以选择FE_DOWNWARD,但这与运行时而不是编译时有关.
有没有人知道编译时转换这样的标志?
仅供参考,GCC手册中的相关章节指出:
\n\n\n\n\n如何为某些浮点常量选择最接近的可表示值或紧邻最近可表示值的较大或较小的\n 可表示值(C90 6.1.3.1、C99 和 C11 6.4.4.2)。
\n\n遵循 C99 附录 F。
\n
在我的 C99 标准草案中,附录 F 说:
\n\n\n\n\nF.7.2 翻译
\n\n在转换过程中,IEC 60559 默认模式有效:
\n\n\xe2\x80\x94 舍入方向模式为舍入到最接近。
\n
\n \xe2\x80\x94 设置舍入精度模式(如果支持),以便结果不会缩短。
\n \xe2\x80\x94 对所有浮点异常禁用捕获或停止(如果支持)
这似乎清楚地表明
\n\n使用十六进制语法来获得所需的确切值float
似乎是正确的解决方案,并且(我猜)语法存在的原因。