Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

相對誤差(Relative Error)

給定一個實際值a 並查找一個值v ,相對誤差可以使用下面的形式計算:

然而,這個庫中的測試程序使用對稱的形式:

用於計算相對差(relative difference) 並且在使用中不那麼易於出錯,因為我們不需要擔心哪一個值是「真實值」,哪一個是實驗值。它保證返回的值至少與相對誤差一樣大。

當其中一個值為0時需要特別注意:在這種情況下,我們要麼使用絕對誤差(但那只是一種欺騙(cheating),因為絕對誤差非常小),或者在這種特殊情況下,我們可以把1或是一個無限值賦給相對誤差。在這個庫的特殊函數的測試用例中,小於一個指定值的值都被當作「有效零(effectively zero)」,否則如果有一項為0,那麼相對誤差為1.這個當前的指定值被設置為std::numeric_limits<>::min():換句話說,所有的denormalised numbers 都被看作0。

所有的測試程序都計算量化的相對誤差(quantized relative error) ,而這個手冊中的圖像是使用實際誤差來生成的。區別如下:在測試程序中,當程序完成後,在測試時,測試數據被捨入到最大的目標實數類型,所以觀測到的誤差將會是從實際誤差向上捨入或是向下捨入的units in the last place 的所有總和。相反 真實誤差(true error) 是通過將被計算的值的精度進行擴充,然後與實際的值進行比較:在這種情況下,計算誤差可能是units in the last place的分數倍數。

注意,在整個手冊中以及測試程序中,相對誤差通常使用10的-5次方作為單位。然而,units in the last place 更精確地反映了 contaminated digit 的個數, 而且相對誤差與units in the last place相比可能有一個因子為2的偏差。換句話說:同樣函數的兩個實現,最大的相對誤差除以2可以實際精確到同樣的二進制數字。這裡已經提醒你了!

零誤差的不可能性(The Impossibility of Zero Error)

對於這個庫中的許多函數,如果計算可以使用一些保護位來完成,那麼假定誤差為「有效零(effectively zeor)」。然而,應當記住的是,如果結果是一個transcendental number ,那麼作為一個原理,我們永遠也不能確定結果精確到超過 1 ulp。這是一個the table makers dilemma的例子:考慮當第一個保護位數字是1的時候會發生什麼,並且其它的保護位數字都為0。我們有沒有一個連接呢(tie)?因為關於 transcendental number 數我們唯一可以談論的是它的數字沒有特定的形式,因此永遠也不能說我們有一個連接(tie),不論我們使用多少個保護位數字。因此,我們永遠也不能確定結果被向正確的方向捨入。當然 transcendental numbers 偶爾會成為一個連接(tie) - 針對於我們所使用的保護位數字的個數-是相當罕見的。並且當我們使用更多的保護位數字的時候變得更罕見,但儘管如此.......

參考經典的文獻What Every Computer Scientist Should Know About Floating-Point Arithmetic 瞭解更多信息。


PrevUpHomeNext