【问题标题】:round to even not consistently applied?轮到甚至没有一致地应用?
【发布时间】:2017-05-07 08:48:21
【问题描述】:

(上下文:我正在为嵌入式应用程序编写一个轻量级的 printf(),并且我希望它在实用时表现得像真正的 printf()。)

我了解 gcc 和其他行为良好的库在以下情况下使用“四舍五入”(又名“银行家四舍五入”)来防止统计偏差:

printf("%0.0f %0.0f %0.0f %0.0f\n", 0.5, 1.5, 2.5, 3.5);
=> 0 2 2 4

令我惊讶的是,相同的舍入规则不适用于其他精度:

printf("%0.1f %0.1f %0.1f %0.1f\n", 0.05, 0.15, 0.25, 0.35);
=> 0.1 0.1 0.2 0.3

这是预期的行为吗?我本来期望的:

=> 0.0 0.2 0.2 0.4

精通数值计算的人能否解释一下所需的行为,以及为什么?

(注意:请参阅http://rextester.com/IUXDW9788 以获取实时示例。)

【问题讨论】:

    标签: c floating-point printf rounding


    【解决方案1】:

    区别在于输入的数字,而不是格式。

    0.5、1.5、2.5、3.5 和 0.25 都可以在 IEEE 754 64 位二进制中精确表示,这是 C double 的最可能实现,因此适用取整规则。

    最接近 0.05 的可表示值是 0.05000000000000000277555756156289135105907917022705078125,比 0.0 更接近 0.1

    最接近 0.15 的可表示值是 0.1499999999999999944488848768742172978818416595458984375,比 0.2 更接近 0.1。

    最接近 0.35 的可表示值是 0.34999999999999997779553950749686919152736663818359375,它更接近 0.3 而不是 0.4。

    四舍五入规则仅适用于两个可能结果之间恰好一半的数字,不适用于与其中一个可能结果相比更接近另一个可能结果的数字。

    【讨论】:

    • 不错。一旦你记住了引擎盖下发生的事情,那就很有意义了。感谢您的明确答复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2011-05-18
    • 2020-11-25
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2014-10-10
    相关资源
    最近更新 更多