我已经实现了 Kahan floating point summation algorithm在 java 。我想将它与 Java 中的内置浮点加法和 Mathematica 中的无限精度加法进行比较。然而,我拥有的数据集不适合测试,因为数字彼此接近。 (条件号~=1)
在我的数据集上运行 Kahan 给出的结果与内置 +
几乎相同。
有人可以建议如何生成可能导致严重舍入误差的大量数据吗?
最佳答案
However the data set I have is not good for testing, because the numbers are close to each other.
听起来你已经知道问题出在哪里了。开始吧 =)
您需要一些东西:
- 数量级差异很大的数字,因此较小数字的大部分精度都会因简单求和而丢失。
- 具有不同符号和几乎相等(或相等)大小的数字,从而导致灾难性抵消。
- 设置了一些低位的数字,以增强舍入效果。
首先,您可以尝试一些简单的三项求和,这应该可以清楚地显示效果:
1.0 + 1.0e-20 - 1.0
通过简单求和进行评估,结果为0.0
;显然不正确。您还可以查看以下形式的总和:
a0 + a1 + a2 + ... + an - b
其中 b
是简单计算的 a0 + ... + an
之和。
关于java - 生成病态数据以测试浮点求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6602363/