java.lang.Math
文档对许多函数说,例如Math.pow
:
计算结果必须在精确结果的1 ulp范围内。
但我无法确切地找到这意味着什么。它是独家的还是包容性的?换句话说,如果确切的结果可以用double表示,那么返回的值是否包含精确的结果,或者它仍然可以被1 ULP关闭?
例如,我们可以依赖Math.pow(3.0, 2.0) == 9.0
吗?我知道使用平等比较对双打来说几乎总是一个坏主意,所以我主要是出于好奇,并且当他们做类似的事情时能够指出他们的错误(或让他们放心)。
答案 0 :(得分:6)
仅供参考,
实施规范的质量涉及两个属性, 返回结果的准确性和方法的单调性。 浮点数学方法的准确性是用来衡量的 ulps,最后一个单位。对于给定的浮点格式,a 特定实数值的ulp是两者之间的距离 包含该数值的浮点值。讨论时 整个方法的准确性而不是特定的方法 参数,引用的ulps数量是最坏情况下的错误 论点。如果方法的误差总是小于0.5 ulps,那么 方法始终返回最接近精确的浮点数 结果;这样的方法是正确舍入的。一个正确的舍入方法 通常是最好的浮点近似可以;然而, 许多浮点方法是正确的,这是不切实际的 圆形。
相反,对于Math类,更大的误差界限为1或2 ulps 允许某些方法。 非正式地,错误限制为1 ulp, 当确切的结果是可表示的数字时,确切的结果 应作为计算结果返回;否则,任何一个 包含精确结果的两个浮点值可能是 返回。强>
对于大幅度的精确结果,其中一个端点 支架可能是无限的。除了个人论点的准确性, 维持不同参数的方法之间的正确关系 也很重要。因此,大多数方法超过0.5 ulp 错误要求是半单调的:每当数学 函数不递减,浮点近似也是如此, 同样,每当数学函数不增加时,也是如此 浮点近似。并非所有近似值都为1 ulp精度将自动满足单调性要求。