java.lang.Math-是“在1 ULP内”的独占或包含?

时间:2016-02-26 18:02:57

标签: java floating-point precision floating-accuracy

java.lang.Math文档对许多函数说,例如Math.pow

  

计算结果必须在精确结果的1 ulp范围内。

但我无法确切地找到这意味着什么。它是独家的还是包容性的?换句话说,如果确切的结果可以用double表示,那么返回的值是否包含精确的结果,或者它仍然可以被1 ULP关闭?

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

1 个答案:

答案 0 :(得分:6)

仅供参考,

  

实施规范的质量涉及两个属性,   返回结果的准确性和方法的单调性。   浮点数学方法的准确性是用来衡量的   ulps,最后一个单位。对于给定的浮点格式,a   特定实数值的ulp是两者之间的距离   包含该数值的浮点值。讨论时   整个方法的准确性而不是特定的方法   参数,引用的ulps数量是最坏情况下的错误   论点。如果方法的误差总是小于0.5 ulps,那么   方法始终返回最接近精确的浮点数   结果;这样的方法是正确舍入的。一个正确的舍入方法   通常是最好的浮点近似可以;然而,   许多浮点方法是正确的,这是不切实际的   圆形。

     

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

     

对于大幅度的精确结果,其中一个端点   支架可能是无限的。除了个人论点的准确性,   维持不同参数的方法之间的正确关系   也很重要。因此,大多数方法超过0.5 ulp   错误要求是半单调的:每当数学   函数不递减,浮点近似也是如此,   同样,每当数学函数不增加时,也是如此   浮点近似。并非所有近似值都为1   ulp精度将自动满足单调性要求。

Source