C float直译

时间:2018-02-23 13:14:37

标签: c gcc floating-point 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.

因为我们使用这些数字作为阈值,这显然有所不同。宇宙编译器声明它使用向下舍入实现。由于GCC非常复杂,我想知道它是否有一个允许在编译时选择行为的编译器标志。到目前为止,我只发现你可以选择FE_DOWNWARD,但这与运行时而不是编译时有关。

有没有人知道编译时转换这样的标志?

1 个答案:

答案 0 :(得分:3)

仅供参考,relevant chapter in GCC's manual州:

  

最接近的可表示值或更大或更小的可表示的值   选择紧邻最近可表示值的值   某些浮动常数(C90 6.1.3.1,C99和C11 6.4.4.2)。

     

遵循C99附件F.

在我的C99标准草案中,附件F说:

  

F.7.2翻译

     

在翻译期间,IEC 60559默认模式有效:

     

- 舍入方向模式四舍五入到最近    - 设置舍入精度模式(如果支持),以便不缩短结果    - 对所有浮点异常

禁用陷阱或停止(如果支持)

所以这似乎清楚地说明了

  • GCC使用舍入到最近。
  • 你无法改变它。

使用十六进制语法来获得所需的精确float似乎是正确的解决方案,并且(我猜)语法存在的原因。