C11标准FE_TONEAREST舍入模式是否保证中间值向偶舍入?
C11 FE_TONEAREST舍入行为说明
结论先行
只要C11实现支持IEC 60559(IEEE 754)浮点数规范,FE_TONEAREST对应的半值向偶舍入行为就是强制要求的,不属于实现定义范畴。
依据说明
- C11标准明确将
<fenv.h>中定义的FE_TONEAREST宏绑定到IEC 60559的标准舍入模式,没有给实现预留自定义规则的空间,相关说明如下:
<fenv.h>头文件中的fegetround和fesetround函数提供了选择IEC 60559定向舍入模式的功能,这些模式由<fenv.h>中的舍入方向宏(FE_TONEAREST、FE_UPWARD、FE_DOWNWARD、FE_TOWARDZERO)表示,且FLT_ROUNDS的取值0、1、2、3分别对应这些IEC 60559定向舍入模式。
- IEC 60559规范中对
roundTiesToEven模式(即C标准的FE_TONEAREST)的定义就是:待舍入值处于两个相邻可表示浮点数正中间时,选择最低有效位为偶数的那个值作为结果;非中间值直接选择最接近的可表示值。 - 可通过编译期检查
__STDC_IEC_559__宏是否被定义为1,确认目标实现是否符合IEC 60559规范,只要该宏存在且值为1,FE_TONEAREST的半值向偶舍入行为就完全可预期。
兼容建议
如果代码必须依赖半值向偶舍入特性,可在代码中加入编译期校验逻辑,当__STDC_IEC_559__未定义时抛出编译错误,避免不符合要求的实现导致逻辑异常。
内容的提问来源于stack exchange,提问作者Benjie
相关产品推荐
相关产品推荐

