如何确定浮点计算中的错误?

时间:2015-10-03 00:29:31

标签: math binary floating-point floating-accuracy ieee-754

我想在浮点运算中实现以下等式:

公式:sqrt((a-b)^ 2 +(c-d)^ 2 +(e-f)^ 2)

我想知道如何确定尾数的宽度如何影响结果的准确性?这如何影响结果的准确性?我想知道确定这个的正确数学方法是什么?

例如,如果我执行以下操作,在每个步骤之后如何影响准确度?

以下是步骤:

步骤1 ,在32位单精度浮点中执行以下计算:x =(a-b),y =(c-d),z =(e-f)

第2步,将三个结果四舍五入为16位的尾数(不包括隐藏位),

第3步,执行以下平方操作:x2 = x ^ 2,y2 = y ^ 2,z2 = z ^ 2

第4步,将x2,y2和z2舍入到10位的尾数(小数点后)。

第5步,添加值:w = x2 + y2 = z2

第6步,将结果舍入为16位

第7步,取平方根:sqrt(w)

第8步,舍入到20个尾数位(不包括尾数)。

1 个答案:

答案 0 :(得分:1)

有多种方法可以表示浮点数的错误。存在相对误差(a *(1 +ε)),略微不同的ULP误差(a + ulp(a)*ε)和相对误差。它们中的每一个都可用于分析错误,但都有缺点。为了获得合理的结果,您通常必须考虑在浮点计算中精确发生的事情。我担心“正确的数学方法”需要做很多工作,相反,我会给你以下内容。

简化的基于ULP的分析

以下分析非常简洁,但它确实能让您对最终出现的错误感到满意。只是将它们视为示例。

<强>(A-B) 操作本身最多会出现0.5 ULP错误(如果舍入RNE)。 与输入相比,此操作的舍入误差可能很小,但如果输入非常相似并且已经包含错误,那么除了噪声之外,您可能只剩下其他内容了!

(适用一个^ 2) 此操作不仅会使输入倍增,还会使输入错误倍增。如果处理相对误差,则意味着至少将误差乘以另一个尾数。有趣的是,乘法器中有一个小的归一化步骤,这意味着如果乘法结果超过两个边界的幂,则相对误差减半。最糟糕的情况是输入乘以低于该值,例如有两个输入几乎是sqrt(2)。在这种情况下,输入错误乘以2 *ε* sqrt(2)。如果额外的最终舍入误差为0.5 ULP,则总误差为~2 ULP。

添加正数 这里最糟糕的情况只是输入错误加在一起,加上另一个舍入错误。我们现在处于3 * 2 + 0.5 = 6.5 ULP。

<强> SQRT sqrt的最坏情况是输入接近例如1.0。该错误大致只是通过,加上一个额外的舍入错误。我们现在处于7 ULP。

中间舍入步骤 插入中间舍入步骤需要更多的工作。 您可以将这些模型建模为与您正在四舍五入的位数相关的错误。例如。从RNE引入23到10位的尾数相对于23位尾数引入额外的2 ^(13-2)ULP误差,或者对新尾数引入0.5 ULP(你将拥有如果你想使用它,请缩小你的其他错误。)

我会留给你来计算你的详细例子的错误,但正如评论者指出的那样,舍入到10位尾数将占主导地位,你的最终结果将精确到大约8个尾数位。