2010-02-02 66 views
2

我不知道是否有像eps這樣的東西代表C++中機器精度的值?我可以使用它作爲double可以表示的最小正數嗎?是否可以使用1.0/eps作爲double可以表示的最大正數?我在哪裏可以在C++和C標準庫中找到eps?機器精度

感謝和問候!


UPDATE:

對於我的目的,我想計算的權重爲類似反距離加權插值(http://en.wikipedia.org/wiki/Inverse_distance_weighting)的距離的倒數。

double wgt = 0, wgt_tmp, result = 0; 
for (int i = 0; i < num; i++) 
{ 
    wgt_tmp = 1.0/dist[i]; 
    wgt += wgt_tmp; 
    result += wgt_tmp * values[i]; 
} 
results /= wgt; 

但是,距離可以是0,我需要使權重適合計算。如果dist [i]只有一個距離爲0,我希望其相應的值[i]占主導地位。如果有幾個距離是0,我希望他們的值對結果作出同樣的貢獻。任何想法如何實現它?

+1

你真的想要使用最大的雙精度數字的重量?可能會有問題,特別是如果距離爲i的多個值爲0。雙倍的最大值約爲10^308。當距離== 0時,將wgt_tmp設置爲10^150可能會更好一些,(只要其他權重比這個小得多)將具有對所有值取未加權平均值的效果,其中距離== 0 ,當存在這樣的值時,或當所有距離都不爲零時對所有值的加權平均值。 – 2010-02-02 16:03:16

+0

謝謝克里斯。他們是很好的建議。當存儲在雙重類型中的距離不是0但非常小時,它的倒數是否會超過雙精度值的最大值?如果是的話,你如何檢查距離是否足夠小以限制其倒數? – Tim 2010-02-02 16:08:58

回答

2

這完全取決於您希望從數字中獲得的精度,雙數中的最大值非常大,但會遭受巨大的舍入誤差。例如,如果您需要1e-3的精度,則在浮點後至少需要10位,這意味着您不應該使用大於尾數中的位數減去10的指數(如果是雙精度),即52 - 10 = 42,最大值約爲4e12,最小值約爲2.5e-13。

3

只需要尋找numeric limits的信息?

該鏈接顯示如何使用C++標準庫查找epsilon,非規範化最小等。 C標準庫中沒有這些對等物。你需要自己計算它們(維基百科關於「機器epsilon」的文章舉了一個例子)...

至於算法,不能幫助你,而這不是你原來的問題的一部分,抱歉。

+0

謝謝,我的問題不止於此。 – Tim 2010-02-02 16:13:08

+0

好的。當我發佈這個答案時,這就是你要求的所有... – 2010-02-02 17:38:07

3

使用#include <limits>你有

小正值= std::numeric_limits<float>::denorm_min()

最大正值= std::numeric_limits<float>::max()

顯然,這也適用於其他類型的爲好。

numeric_limits

而且沒有,最小正值的倒數不等於最大。

+0

謝謝,你能回答我的其他問題嗎? – Tim 2010-02-02 16:12:34