簡體   English   中英

如果不能容納足夠多的有效數字,那么雙精度數如何代表比小數更高的數字?

[英]How can doubles represent higher numbers than decimals if they can't hold as many significant figures?

我很可能沒有對重要人物的正確理解,但是這本書

Joseph Albahari和Ben Albahari(O'Reilly)撰寫的C#6.0概述。

版權所有2016 Joseph Albahari和Ben Albahari,978-1-491-92706-9。

提供下表用於比較doubledecimal

在此處輸入圖片說明

一方面,雙精度數可以容納較少數量的有效數字 ,另一方面,它可以表示大於十進制數的數字,而后者可以容納更多數量的有效數字 ,這不是違反直覺嗎?

假設您被告知可以存儲一個值,但是卻受到限制:您只能存儲10位數字,0-9和一個負號。 您可以創建規則以對值進行解碼,因此可以存儲任何值。

存儲事物的第一種方法就是將其簡單地存儲為xxxxxxxxxx值,這意味着數字123被存儲為0000000123 易於存儲和閱讀。 這就是int工作方式。

現在,您決定要存儲小數,因此可以稍微更改規則。 現在,您存儲xxxxxxyyyy ,其中x是整數部分, y是小數部分。 因此,123.98將被存儲為0001239800 這大致是Decimal值的工作方式。 您可以看到我可以存儲的最大值是9999999999 ,它轉換為999999.9999。 這意味着我對值的大小有嚴格的上限,但是有效位數為10。

有一種方法可以存儲較大的值,即存儲公式的x和y分量 x * 10 ^ y xxxxxxyyyy 因此,要存儲123.98,您需要存儲01239800-2 ,我可以將其計算為 12398 * 10 ^ -2 這意味着我可以通過更改“ y”來存儲更大的數字,但是有效數字的數量基本上固定為6。這基本上就是double工作方式。

答案在於對double進行編碼的方式。 它們具有3個部分,而不僅僅是數字的直接二進制表示形式:符號,指數和分數。

  • 該符號很明顯,它控制+或-。

  • 分數部分也很明顯。 它是二進制分數,表示介於0和1之間的數字。

  • 指數就是魔術發生的地方。 它表示比例因子。

最終的浮動計算結果為(-1)^ $ sign *(1 + $ fraction)* 2 ^ $ exponent

由於指數的原因,這允許比直接的十進制數字高得多的值。 那里有很多關於為什么這樣做以及如何對這些編碼數字進行加法和乘法的讀物。 Google圍繞“ IEEE浮點格式”或您需要的任何主題。 希望有幫助!

范圍與精度無關。 Double具有二進制表示形式(以2為底)。 並非所有數字都可以完全按照人類所知道的十進制格式表示。 更不用說和加法和除法的累積舍入誤差。 較大的范圍表示比十進制更大的MAX VALUE和最小MIN VALUE。

另一邊的小數是(以10為底)。 它具有較小的范圍(較小的MAX VALUE和較大的MIN VALUE)。 這與精度無關,因為它不是使用浮點二進制點表示法表示的 ,它可以更精確地表示數字,盡管建議將其用於人造數字和計算。

暫無
暫無

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

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