估计重要性错误的丢失

时间:2018-04-12 08:26:36

标签: floating-point

当使用具有15位精度的浮点运算来计算(20-(sqrt(32397)/9))^(1/3)时,我得到了取消错误,因为(sqrt(32397)/9) = 19.9990740526396。因此20-(sqrt(32397)/9)=0.000925947369386我失去了3位有效数字。在计算(20-(sqrt(32397)/9))^(1/3)知道我丢失了3位有效数字时,这是绝对误差还是相对误差?

1 个答案:

答案 0 :(得分:1)

我认为算术是使用IEEE-754基本64位二进制浮点完成的。在这种格式中,有效数字有53位。如果精确的数学结果在格式的有限范围内,那么当将结果舍入到最接近的可表示值时,误差永远不会超过最低有效位的值的1/2(因为可表示数字之间的间距是1单位的最低有效位(ULP),因此两个可表示数字之间的任何点距离其中一个最多1/2个单位)。例如,对于[1024,2048]中的数字,有效数字的最高有效位的值为1024 = 2 10 ,因此最低有效位的值为2 10-52 = 2 -42 ,一半是2 -43

32397的平方根接近180,因此它在[128,256]中,因此正确计算它的误差最多为2 7-53 = 2 -46 。现在,不是使用数学sqrt(32397),计算结果是sqrt(32397)+ e0,对于某些错误e0,| e0 | ≤2 -46

除以9会产生一个接近20的数字,即[16,32],因此计算它的误差最多为2 4-53 = 2 -49 。现在,我们没有sqrt(32397)/ 9,而是(sqrt(32397)+ e0)/ 9 + e1,| e1 | ≤2 -49

接下来,我们从20减去。因为我们减去的值接近20,所以在这个计算中没有错误 - 数字的两个有效数字是对齐的,所以差异的所有位都在有效数字段内,而且计算没有损失。所以我们的结果是20 - ((sqrt(32397)+ e0)/ 9 + e1)。这是接近.000926。

我们可以将其重写为20-sqrt(32397)/ 9-(e0 / 9-e1)。

最后,我们想要采用它的立方根。某些语言具有立方根函数,例如C cbrt。其他人具有通用取幂函数,例如pow。这些功能的一个问题是它们可能不会返回正确的舍入结果。尽管理论上可以返回最接近精确数学结果的可表示值,但是难以通过正确的舍入和良好的性能来实现这些例程。如此众多的供应商提供的实现几个精度最低的单位,有时甚至更多。对于这个分析,我将忽略这一点,并假设我们已经实现了cbrt正确的舍入。 (另一个问题是,在pow(x, 1./3)中,1./3中存在舍入错误。)

cbrt(20−sqrt(32397)/9)的结果接近.0975。所以它在[2 -4 ,2 -5 ),所以错误正确舍入最多为2 -4-53 = 2 -57 。因此,我们的最终结果是 cbrt(20-sqrt(32397)/ 9-(e0 / 9-e1))+ e2,其中| e2 | ≤2 -57

e0 / 9 + e1对结果有什么影响? x 的导数是⅓x-⅔。在这种情况下,x接近.000926,因此导数约为⅓•.000926 -⅔,约为35.09。所以cbrt(20-sqrt(32397)/ 9-(e0 / 9-e1))+ e2约为cbrt(20-sqrt(32397)/ 9) - 35.09•(e0 / 9-e1))+ e2。 / p>

当e0 = 2 -46 ,e1 = -2 -49 ,e2 = 2 -57时,我们可以看到这种错误的最坏情况。 或他们的否定,所以最差的错误是大约35.09•(2 -46 / 9 + 2 -49 )+ 2-57,大约是1.1775 •10 -13 。这是错误的绝对约束。

1.1775·10 -13 是计算结果的约572,710 ULP,0.0009259473603862033996847458183765411376953125,因此,错误最多约为格式中53位的19位。我们还可以看到,其中大部分是由于平方根和立方根的放大。这反过来意味着cartpow中的错误并不重要。

这是一个松散的分析,假设所有错误的最坏情况。 Wolfram Alpha告诉我们答案是0.00092594736038878119971220426211127130143170165573352111194295384299674116115388187388830966295069874661712910887 ...,计算结果与12357.8393 ULP不同。