【问题标题】:Floating point error in ULPs (units in the last place)ULP 中的浮点错误(最后一位的单位)
【发布时间】:2021-03-29 00:43:10
【问题描述】:

此问题基于 David Goldberg 的论文 What Every Computer Scientist Should Know About Floating-Point Arithmetic。在第 1.2 节相对误差和 Ulps(第 8 页)中,论文给出了一个计算误差的公式,ULP(最后一位的单位):

| d.d…d - (z/(β^e)) | β^(p-1)

其中d.d…d * (β^e) 是数字z 的浮点表示,βp 是表示的基数和精度。

在本文后面(第 9 页)有一个示例评估操作10.1 - 9.93 的结果,当使用β = 10p = 3 的浮点表示时,它会导致0.2,它说结果0.2 有 30 个 ULP 的错误,结果中的每个数字都是错误的。但是我无法使用上面的公式得出 30 ULP 的误差,我在使用上面的公式计算误差时得到的值是 0.3 ULP。

我是这样计算的:

(0.02 - (0.17/(10^1)))*10^(3-1) = 0.3      // 0.17 is the actual difference

我错过了什么吗?

【问题讨论】:

  • 这个问题让我觉得这个网站跑题了。对于给出的示例,1 ulp 的数值大小 = 0.001。 0.200 和 0.170 的正确结果之间的差异是 0.030,因此是 30 ulps。
  • @njuffa 你是怎么得出结果的 1 ulp = 0.001,这里的精度是 3,所以根据我的理解,任何数字的形式都是 d.dd * β^e
  • 这些是十年中的三位数字 [.100, .999]。所以最小的增量是 0.001。将 ulp-error 视为缩放的绝对误差,十进制算术中的比例因子每十进制变化 10 倍,二进制算术中的每个二进制数变化为 2 倍。

标签: floating-point precision


【解决方案1】:

10.1 - 9.93 的无限精度差为 0.17。

β = 10 和 p = 3 的机器返回 0.200 的差异。
注意 3 个有效的以 10 为基数的数字为 p = 3。

误差值为|0.17 - 0.2|或 0.03 。

这台机器上 0.200 的 ULP 是 0.001。

正确答案是 0.03/0.001 或 0.2 的 30 个 ULP。


使用上述公式计算误差时得到的值为 0.3 ULP。

误差可能是 10.1 的 0.3 ULP。 ULP 不是给定机器的常数,而是每个值的函数 ULP(x)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-12
    • 2019-01-06
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    相关资源
    最近更新 更多