【问题标题】:Accuracy of the computation计算的准确性
【发布时间】:2021-05-10 20:44:21
【问题描述】:

如果 x 和 y 都可以(精确)存储在系统中的浮点数中,计算精度将是多少。

x - (x/y) * y

【问题讨论】:

  • eps(x) 可能会让您了解计算错误

标签: matlab floating-point precision floating-accuracy


【解决方案1】:

在下溢的情况下,错误可能与 x 一样大,例如,如果比率 x/y 完全消失并四舍五入为零。

x=2^-100, y=2^1000为例。

否则,如果 x/y 没有被非规范化(没有下溢),我的猜测是大多数时候你会得到一个完美的零,最多 eps(x) - 即 1 ulp(x)时间,只要 Matlab 引擎遵守 IEEE754 标准。

原因是这个:注意舍入误差e

float(x/y) = x/y + e

通过四舍五入,甚至与 IEEE754 模式相关,我们有

abs(e) < ulp(x/y)/2

对于除法,这是一个严格的不等式,否则除法必须是精确的。如果它是准确的,我们确信商适合可用的有效数字(除非除法下溢)。

当我们乘以 y 时,我们得到这个精确的结果:

x + e*y

我们需要有 e*y &gt;= ulp(x)/2 才能将这个确切的结果四舍五入 x
那是y*ulp(x/y)/2 &gt; e*y &gt;= ulp(x)/2
这可能发生,例如尝试:

x=2^52+2^51+1 , y=2^52+1 , x - (x/y)*y , y*eps(x/y)/2 > eps(x)/2

但是y*ulp(x/y)/2 &gt; e*y &gt;= 3*ulp(x)/2不能,所以结果不能是2 ulp off。
这演示起来很乏味,所以我的回答仍然是一个猜测。

最后的减法运算将是精确的 - 请参阅https://en.wikipedia.org/wiki/Sterbenz_lemma

【讨论】:

  • Answer 很好地解决了逐渐和完全的下溢问题。然而x/y 也可能溢出导致其他问题。
猜你喜欢
  • 2012-07-10
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 2023-03-05
  • 2020-12-20
  • 1970-01-01
相关资源
最近更新 更多