簡體   English   中英

如何確定浮點計算中的誤差?

[英]How to determine error in floating-point calculations?

我有以下要在浮點運算中實現的方程式:

等式:sqrt((ab)^ 2 +(cd)^ 2 +(ef)^ 2)

我想知道如何確定尾數的寬度如何影響結果的准確性? 這如何影響結果的准確性? 我想知道確定這個的正確數學方法是什么?

例如,如果我執行以下操作,那么在每個步驟之后,精度將如何受到影響?

步驟如下:

步驟1 ,在32位單精度浮點中執行以下計算:x =(ab),y =(cd),z =(ef)

步驟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個尾數位(不包括尾數)。

有多種表示浮點數錯誤的方法。 存在相對誤差(a *(1 +ε)),略有不同的ULP誤差(a + ulp(a)*ε)和相對誤差。 它們每個都可以用於分析錯誤,但是都有缺點。 為了獲得合理的結果,您通常必須考慮到浮點計算內部恰好發生了什么。 恐怕“正確的數學方法”需要大量工作,因此,我將為您提供以下內容。

簡化的基於ULP的分析

以下分析是很粗略的,但是對於您最終會遇到多少錯誤,它的確給出了很好的“感覺”。 僅將這些作為示例。

(ab)運算本身最多會產生0.5 ULP誤差(如果四舍五入RNE)。 與輸入相比,此操作的舍入誤差可能很小,但是如果輸入非常相似並且已經包含誤差,則除了噪音之外,您將一無所有!

(a ^ 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位尾數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM