【问题标题】:IEEE 754 rounding or choppingIEEE 754 舍入或斩波
【发布时间】:2014-12-10 13:37:26
【问题描述】:
谁以及在什么阶段决定使用切分或舍入数字?例如,如果我编写了一个 C 程序并且其中有一个 double 变量,那么数字 2.57 会发生什么(不管它的浮点表示形式)?是切到2.5 还是四舍五入到2.6?我的 C 编译器会在这两种可能性之间做出决定吗? IEEE 754 标准是否说明了我的 C 编译器应该做什么?它是在我的 CPU 架构还是我的操作系统中实现的?
【问题讨论】:
标签:
c
floating-point
ieee-754
【解决方案1】:
它是实现定义的。具体来说,虽然常用,但 C 标准并不强制支持 IEEE-754。
C11 §6.4.4.2 浮动常量 section3
有效数字部分被解释为(十进制或十六进制)有理数;指数部分的数字序列被解释为十进制整数。对于十进制浮点常量,指数表示 10 的幂,有效数部分将按其缩放。对于十六进制浮点常量,指数表示 2 的幂,有效数部分将按其缩放。对于十进制浮点常量,以及当FLT_RADIX 不是 2 的幂时的十六进制浮点常量,结果要么是最接近的可表示值,要么是紧邻最接近的可表示值的较大或较小的可表示值,选择以实现定义的方式。 对于十六进制浮点常量,当FLT_RADIX 是 2 的幂时,结果被正确舍入。
【解决方案2】:
正如@YuHao C 标准所指出的那样,C 标准不强制遵守IEEE-754,但是有一个预定义的宏来检查它。参考 N1570 §6.10.8.3/p1,条件特征宏:
__STDC_IEC_559__ 整数常量 1,用于表示符合附件 F 中的规范(IEC 60559 浮点
算术)。
__STDC_IEC_559_COMPLEX__ 整数常数 1,用于表示符合附录 G 中的规范(IEC 60559
兼容的复数算法)
您会发现它实际上与 IEEE-754 标准相同。
这些宏也(有条件地)在 C99 (N1256 §6.10.8/p2) 中定义。