【发布时间】: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 的结果,当使用β = 10 和p = 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 倍。