簡體   English   中英

機器精度以及雙精度類型的最大值和最小值

[英]machine precision and max and min value of a double-precision type

(1)我遇到過幾種將epsilon添加到非負變量以保證非零值的情況。 所以我想知道為什么不添加數據類型可以代表的最小值而不是epsilon? 這兩個可以解決的區別問題是什么?

(2)另外,我注意到雙精度類型的最大值的倒數大於其最小值,而其最小值的倒數是inf,遠大於其最大值。 計算最大值和最小值的倒數是否有用?

(3)對於一個很小的雙精度正數,要計算其倒數,當倒數開始沒有意義時,它有多小? 設定互惠上限是否更好? 界限是多少?

謝謝並恭祝安康

厄普西隆

Epsilon是可以加到1.0並產生與1.0明顯不同的結果的最小值。 正如Poita_暗示的那樣,這對於處理舍入錯誤很有用。 這種情況非常簡單:普通浮點數的精度無論其大小如何都保持不變。 換句話說,它總是計算出相同數量的有效數字。 例如, double的典型實現將具有約15個有效數字(轉換為Epsilon =〜1e-15)。 如果您使用的數字在10e-200范圍內,則它可以代表的最小變化約為10e-215。 如果您使用的數字在10e + 200范圍內,則它可以代表的最小變化約為1e + 185。

有意義地使用Epsilon通常需要將其縮放到您正在使用的數字的范圍,並使用它來定義一個您可能願意接受的范圍(可能由於舍入誤差),因此,如果兩個數字落在該范圍內,則您假設他們可能真的相等。 例如,在Epsilon為1e-15的情況下,您可能決定將落在彼此1e-14之內的數字視為相等(即,有效位數已舍入)。

可以表示的最小數字通常會大大小於該數字。 使用相同的典型double ,通常會在1e-308左右。 如果您使用定點數而不是浮點數, 這將等效於Epsilon。 例如,一次有很多人使用定點繪制各種圖形。 一個典型的版本是一個16位的整數,分成小數點前10位和小數點后六位。 這樣的數字可以表示從大約0到1024的數字,小數點后大約兩個(十進制)數字。 另外,您也可以將其視為帶符號的,從(大約)-512到+512,小數點后大約還有兩位數字。

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

倒數

我不確定您為什么擔心計算極大或極小的倒數。 IEEE浮點使用非正規數,這意味着接近范圍極限的數字會失去精度。 基本上,數字分為指數和有效數。 指數包含數字的大小,有效數字包含有效數字。 每個都用指定的位數表示。 在通常情況下,數字是歸一化的,這意味着它們與我們大家在學校學到的科學計數法模糊地相似。 用科學計數法,您總是調整有效位數和指數,以便在小數點前精確到一位,因此(例如)140變為1.4e2,20030變為2.003e4,依此類推。

可以將其視為浮點數的“規范化”形式。 但是,假設您限制了一個2位數字的指數,因此它只能從-99到+99。 還要假設您最多可以有15個有效數字。 在這些限制范圍內,您可以產生類似0.00001002e-99的數字。 這樣一來,您可以表示小於1e-99的數字,但會損失一些精度-而不是15位數字的精度,而是使用有效數字的5位數字表示幅度,因此只剩下10位數字那真的很重要。

除了采用二進制而不是十進制之外,IEEE浮點大致以這種方式工作。 當您接近范圍的末端時,數字的精度越來越低,直到(在范圍的盡頭)僅剩一點精度。

如果您只采用一位精度的數字,並取其倒數,那么您將得到一個非常大的數字-但是由於您僅以一位精度開始,結果也只能具有一位精度。 盡管總比沒有結果要好,但仍然幾乎沒有意義。 您已經達到位數可以表示的極限。 解決該問題的唯一方法是使用更多位。

倒數(或其他計算)實際上沒有任何一點“停止變得有意義”。 這並不是一個硬道理,一個結果有意義,而另一個沒有意義。 相反,這是一個斜率,其中一個結果可能具有15個數字的精度,而另一個結果可能只有10個數字和三分之一。1“有意義”與否主要取決於您如何解釋該結果。 為了獲得有意義的結果,您需要對最終結果中的多少位數真正有意義有一個清晰的認識。

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

-1 ^符號*有效位數* 2 ^指數

  1. 這意味着最小的數字是一個非常小的值,即具有最小指數的小數有效位數。 但是,舍入誤差要大得多,並且取決於數字的大小,即具有給定指數的最小數字。 ε是1.0與下一個可表示的較大值之間的差。 這就是在代碼中使用epsilon的原因,該代碼對舍入錯誤具有魯棒性,如果正確執行,實際上應該使用處理的數字的大小來縮放epsilon。 通常,最小的可表示值實際上並沒有任何重大用途。

  2. 您會看到規范化最小值和非規范化最小值之間的差異。 問題在於,由於使用有效數的方式,有可能使負指數大於正數,也就是說,有效位數的位模式除最后一位為1之外,全為零,則該指數有效降低有效位數。 為了最大程度地執行此操作,即使將有效位數設置為所有有效位數,有效指數仍將僅是給定的指數。 例如,考慮到0.000001e-10和9.999999e + 10之間的差異,第一個遠小於第二個大。 第一個實際上是1e-16,第二個大約是1e + 11。

  3. 當然,這取決於浮點數的精度。 在雙精度情況下,最大值和下一個較小值之間的差已經很大(沿10 ^ 292行),因此舍入誤差將非常大。 如果值太小,您將直接獲得inf,如您所見。 確實,沒有嚴格的答案,這完全取決於您所需數字的精度。 考慮到舍入誤差約為epsilon *量級,(1 / epsilon)的倒數已經具有大約1.0的舍入誤差,如果您需要精確到1e-3的數字,那么甚至epsilon也將太大而無法除以。

有關某些背景信息,請參見IEEE754Machine epsilon上的這些Wikipedia頁面。

  1. 添加Epsilons來測試應該相等的兩個值之間的相等性,但這並不是因為舍入誤差。 雖然您可以將最小正值用於epsilon,但這並不是最佳選擇,因為它太小了。 由浮點算術引起的舍入誤差幾乎總是超過該最小值,因此需要更大的ε。 多少取決於您所需的精度。

  2. 我不明白這個問題。 倒數對什么有用嗎? 我想不出它們為什么有用的任何理由。

  3. 通常,除以很小的值是一個壞主意,因為它將導致很大的舍入誤差。 我不確定增加上限是什么意思。 只要避免盡可能地除以小數值即可。

暫無
暫無

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

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