2010-02-02 245 views
1

(1)我遇到了一些情況,其中將epsilon添加到非負變量中以確保非零值。所以我想知道爲什麼不添加數據類型可代表的最小值而不是epsilon?這兩個解決方案有什麼區別? (2)另外我注意到,雙精度類型的最大值的倒數大於其最小值,其最小值的倒數是inf,大於其最大值。計算其最大值和最小值的倒數是否有用? (3)對於非常小的雙數類型的正數來計算它的倒數,當它的倒數開始沒有意義時,它有多小?把倒數的上界設置好會更好嗎?界限有多少?機器精度以及雙精度型的最大值和最小值

感謝和問候加入

回答

2

您需要了解如何在CPU中表示浮點數。在數據類型中,爲符號保留1位,即它是正數還是負數(是的,您可以在浮點數中有正數和負數0),那麼爲有效數字保留一些位(或尾數),這些是浮點數中的有效數字,最後爲指數保留一些位。浮點數的值現在爲:

-1^*號尾數* 2 ^指數

  1. 這意味着最小的號碼是一個很小的值,即smalles尾數與指數最低。然而,舍入誤差要大得多,取決於數量的大小,即具有給定指數的最小數。 epsilon是1.0和下一個可表示的較大值之間的差值。這就是爲什麼epsilon被用於對四捨五入錯誤有效的代碼中的原因,並且如果你做得正確,你真的應該使用與你一起工作的數字的大小來擴展epsilon。最小的可表示值通常沒有任何重要用途。

  2. 你會看到歸一化和非規格化最小值之間的差異。問題在於,由於使用有效位的方式,有可能產生一個比正數更大的負指數,比如說有效位的位模式全部爲零,除了最後一位以外,那麼指數是有效的降低有效位數的位數。對於最大值你不能這樣做,即使你設置有效位數爲全部位數,有效指數仍然只是給出的指數。即考慮0.000001e-10和9.999999e + 10之間的差異,第一個比第二個大得多。第一個實際上是1e-16,而第二個是大約1e + 11。

  3. 它當然取決於浮點數的精度。在雙精度情況下,最大值和下一個較小值之間的差異已經很大(沿着10^292的線),所以你的舍入誤差將會非常大。如果這個值太小,你就會像你已經看到的那樣簡單地得到inf。真的,沒有嚴格的答案,完全取決於你需要的數字的精確度。考慮到舍入誤差約爲ε*量級,(1 /ε)的倒數已經具有大約1.0的舍入誤差,如果您需要數字精確到1e-3,那麼即使ε也太大而無法被分割。

見一些背景資料上IEEE754Machine epsilon這些維基百科頁面。

1
  1. Epsilons測試兩個值應該是平等的,但由於舍入誤差不平等。雖然你可以使用ε的最小正值,但它不會是最優的,因爲它太小了。浮點運算引起的舍入誤差幾乎總是超過最小值,因此需要更大的epsilon。多大取決於你想要的準確度。

  2. 我不明白這個問題。互惠對於什麼有用?我想不出爲什麼他們會有用。

  3. 一般來說,除以非常小的值是一個壞主意,因爲它會導致非常大的舍入誤差。我不確定你的意思是增加一個上限。只要儘可能避免用小數值除。

+0

謝謝Poita_。 3,請參閱我的最後一篇文章http://stackoverflow.com/questions/2185296/inverse-distance-weighted-value-and-machine-precision – Tim

4

小量

Epsilon的是,可以添加到1.0,併產生一個結果這是從1.0區分的最小值。正如Poita_所暗示的,這對於處理舍入錯誤很有用。情況非常簡單:普通浮點數的精度保持不變,無論數量的大小如何。爲了稍微不同,它總是計算相同數量的有效數字。例如,double的典型實現將具有大約15個有效數字(其轉換爲Epsilon =〜1e-15)。如果您使用的是10e-200範圍內的數字,則它可以表示的最小變化將在10e-215左右。如果你在10e + 200範圍內使用一個數字,那麼它可以表示的最小變化將在1e + 185左右。

有意義的使用Epsilon通常需要將其擴展到您使用的數字範圍,並使用它來定義您願意接受的範圍,因爲可能由於舍入誤差,所以如果兩個數字落在範圍內那個範圍,你認爲他們可能真的是平等的。例如,對於1e-15的Epsilon,您可能會決定將彼此的1e-14範圍內的數字視爲相等(即有效數字已經因四捨五入而丟失)。

可表示的最小數量通常會比這個數字小得多。有了這個典型的double,它通常會在1e-308左右。這將等於Epsilon 如果您使用的是定點數而不是浮點數。例如,有一段時間,不少人使用定點繪製各種圖形。一個典型的版本是一個16位的整數,分解成小數點前的10位和小數點後的6位。這樣的數字可以表示大約0到1024之間的數字,小數點後面有兩位(十進制)數字。或者,您可以將其視爲有符號的,從(粗略)-512到+512,再次運行小數點後兩位數字。

在這種情況下,縮放因子是固定的,所以兩個數之間可以表示的最小差異也是固定的 - 即1024和下一個較大數之間的差值與0和0之間的差值完全相同下一個更大的數字。

倒數

我不知道確切原因,您擔心計算極大或極小的數字的倒數。 IEEE浮點使用非規範化,這意味着接近範圍限制的數字將失去精度。基本上,一個數字被分成一個指數和一個有效數。指數包含數字的大小,而有效數字包含有效數字。每個都以指定的位數表示。在通常情況下,數字是正常化的,這意味着它們與我們在學校學到的科學記數法有些相似。在科學計數法中,您總是調整有效位數和指數,因此在小數點前有一個位置,所以(例如)140變爲1.4e2,20030變爲2.003e4,依此類推。

將此視爲浮點數的「規格化」形式。然而,假設你限制了一個2位數的指數,所以它只能從-99到+99。另外假設您最多可以有15位有效數字。在這些限制內,您可以生成一個數字,如0.00001002e-99。這可以讓您表示一個小於1e-99的數字,代價是會損失一些精度 - 而不是15位精度,您用有效數的5位數來表示數值,所以只剩下10位數字這真的很重要。

除了它是二進制而不是十進制,IEEE浮點大致這樣工作。 當您接近範圍的末尾時,數字的精度會越來越低,直到(在範圍的最後)您只剩下一個精度位。

如果你把這個數字只有一位精度,並取其倒數,你會得到一個非常大的數字 - 但由於你只是以一位精度開始,所以結果只能有一位精度好。雖然稍好於沒有結果,但它仍然非常接近毫無意義。你已經達到了位數可以表示的極限,解決問題的唯一方法是使用更多位。

實際上並沒有任何一點指出倒數(或其他計算)「停止有意義」。一個結果是有道理的,而另一個結果是不合理的。相反,這是一個斜率,其中一個結果可能有15個數字的精度,另一個結果可能有10個,第三個只有1個。「有意義」與否主要是你如何解釋結果。要獲得有意義的結果,您需要對最終結果中有多少數字真正有意義有一個公平的想法。