【问题标题】:java.lang.Math—is “within 1 ULP” exclusive or inclusive?java.lang.Math——“在 1 ULP 以内”是排他性的还是包含性的?
【发布时间】:2016-02-26 18:02:57
【问题描述】:

java.lang.Math 文档说很多功能,比如Math.pow:

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

但我无法准确找到这意味着什么。是排他性的还是包容性的?换句话说,如果精确的结果可以用双精度表示,返回的值是否包含精确的结果,或者仍然可能偏离 1 个 ULP?

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

【问题讨论】:

    标签: java floating-point precision floating-accuracy


    【解决方案1】:

    仅供参考,

    实施规范的质量涉及两个属性, 返回结果的准确性和方法的单调性。 浮点数学方法的准确性是根据以下方面来衡量的 ulps,单位排在最后。对于给定的浮点格式,一个 特定实数值的 ulp 是两者之间的距离 包围该数值的浮点值。讨论的时候 方法的准确性作为一个整体,而不是在一个特定的 论点,引用的 ulps 数量是针对任何情况下的最坏情况错误 争论。如果一种方法的误差始终小于 0.5 ulps,则 方法总是返回最接近精确的浮点数 结果;这种方法是正确四舍五入的。正确舍入的方法 通常是最好的浮点近似值;然而, 许多浮点方法正确是不切实际的 圆角。

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

    对于数量级较大的精确结果, 括号可能是无限的。除了个别论点的准确性之外, 在不同参数的方法之间保持适当的关系 也很重要。因此,大多数方法超过 0.5 ulp 误差必须是半单调的:只要数学 函数是非递减的,浮点逼近也是如此, 同样,只要数学函数不增加,那么 浮点近似。并非所有具有 1 的近似值 ulp 精度会自动满足单调性要求。

    Source

    【讨论】:

    • 哦,我不知道我在阅读它的时候是怎么漏掉的。无论如何,这完美地回答了这个问题。我稍微修改了一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多