【发布时间】:2016-02-01 14:06:49
【问题描述】:
有人问我以下代码的输出是什么:
floor((0.7+0.6)*10);
返回 12。
我知道浮点表示法不允许以无限精度表示所有数字,我应该预料到会有一些差异。
我的问题是:
我怎么知道这段代码返回的是 12,而不是 13?为什么 (0.7+0.6)*10 比 13 有点少,而不是多?
我可以预期地板功能何时无法正常工作以及何时可以确定正常工作?
注意:我不是在问浮动表示的样子或为什么输出不完全是 13。我想知道我应该如何推断 (0.7+0.6)*10 有点 less 大于 13。
【问题讨论】:
-
请注意,在这种情况下,您可以使用
0.7 * 10 + 0.6 * 10来避免它。一般来说,您可以通过选择一个小因子epsilon(如1E-8)并比较x - epsilon和x + epsilon的下限来检测这一点——如果它们不同,很可能是由于这种影响。 -
@CompuChip 不,这不能“一般”用单个 epsilon 完成,因为浮点数的精度取决于所涉及数字的大小
-
@jofel 指出,对于 IEEE754,您可以假设在符合该标准的每台机器上某些计算都是相同的;但是没有捷径可以不做就知道 OP 的操作结果,无论是在纸上,模拟 CPU 对位的操作,还是使用 CPU 本身。
-
@MarcusMüller 我的建议还是要谨慎一点:如果你在两边都加上 delta,那么你肯定会遇到这种情况。当然,这不排除误报,如果你的计算结果是实际上接近一个整数,这将也发生。
标签: c++ floating-point rounding precision