2016-02-26 16 views
4

java.lang.Math文档说的许多功能,如Math.powjava.lang.Math是否在“ULP内”独占或包含?

计算结果必须是内准确结果的1 ulp。

但我一直没能找到这是什么意思。它是独占的还是包容性的?换句话说,如果精确的结果可以用double表示,那么返回的值是否包含精确的结果,或者它可能仍然是1 ULP?

例如,我们可以依靠Math.pow(3.0, 2.0) == 9.0吗?我知道使用平等比较对于双打来说几乎总是一个坏主意,所以我主要是出于好奇心,并且当他们做那样的事时能够指出人们的错误(或让他们放心)。

回答

6

仅供参考,

实施规范中关注两个属性,返回结果的 准确性和方法的单调性的质量。 浮点型数学方法的精度以 ulps单位测量。对于给定的浮点格式,特定实数值的ulp是两个包含该数值的浮点值之间的距离。当讨论 作为一个整体的方法的准确性而不是在特定的 的论点时,所引用的ulps的数量是针对任何 论点的最差情况误差。如果一个方法总是有小于0.5 ulps的错误,那么 方法总是返回最接近精确的 结果的浮点数;这种方法正确舍入。正确舍入的方法 通常是最好的浮点近似值;然而, 许多浮点方法正确 四舍五入是不切实际的。

相反,对于Math类,对于某些方法,允许1或2个ulps的误差范围较大,为 。 非正式地,如果确切结果是一个可表示的数字,则有1个ulp错误界限, ,应该返回确切结果 作为计算结果;否则, 中包含精确结果的两个浮点值中的任一值可能会返回 。

对于量级较大的确切结果,括号中的一个端点可能是无限的。除了在单个参数上的准确性之外,在不同参数 之间保持方法之间的适当关系的 也是重要的。因此,大多数误差超过0.5 ulp的方法都需要是半单调的:只要数学函数不减少,每当数学函数不增加时,浮点近似也是如此,因此,如此是 的浮点近似。并非所有具有ulp精度的近似值都会自动满足单调性要求。

Source

+1

哦,我不知道读书时我是多么怀念那部分。无论如何,这完全回答了这个问题。我已经编辑了一下。 –