C/C++编译期浮点舍入规则与运行时舍入模式相关问题问询
C/C++ 浮点舍入规则问题解答
1. 编译期浮点求值的舍入规则
C、C++标准对该场景的规则分两种情况:
- 若实现支持 IEEE 754 浮点标准(即定义了宏
__STDC_IEC_559__,当前主流桌面、服务器端编译器均满足该条件),则编译期浮点常量求值强制使用默认向最近舍入(ties to even,即四舍六入五成偶)规则,不受任何运行时舍入配置影响。你给出的double d = 1.0 / 3.0;示例中,编译阶段就会按照该规则把计算结果预存为double类型的常量。 - 若实现不支持 IEEE 754 标准,则编译期舍入规则为实现定义,需参考对应编译器的文档说明。
2. 运行时默认舍入模式的定义
C99、C++11及后续版本标准明确规定:
- 程序启动(含每个新线程启动)时的默认舍入模式固定为
FE_TONEAREST(即上述向最近舍入、五成偶规则)。 fesetround()修改的是当前线程的浮点环境舍入配置,不同线程的舍入模式互相独立,不会互相干扰。
3. 浮点转整数的舍入规则
首先明确:fesetround()设置的舍入模式仅作用于nearbyint()、rint()、浮点数算术运算等明确绑定浮点环境的操作,不覆盖强制类型转换的舍入规则。
浮点值直接强制转换为整数类型的规则是标准明确定义的:向零截断,即直接丢弃小数部分,正数向下取整、负数向上取整,和当前浮点环境配置的舍入模式完全无关。比如(int)2.9结果恒为2,(int)-2.9结果恒为-2,不管你是否调用fesetround()修改过舍入模式。
内容的提问来源于stack exchange,提问作者Bonita Montero
相关产品推荐
相关产品推荐

