【问题标题】: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) 中定义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多