2014-04-22 23 views
3

隨着精度(32位):該位師雲like this浮動和雙 - 有意義的數字 - 尾數POV?

enter image description here

因此,我們必須尾數/有效數位。所以我們可以代表2^23個數字(通過23位):這是8388608 - >這是7位長。

BUT

我正在讀該尾數被歸一化(在尾數的前導數字將始終是一個1) - 這樣的圖案實際上是1.mmmmmm在表示尾數。

例如:看這裏:

enter image description here

0.75表示,但它實際上是1.75

問題#1

所以基本上它增加了1個精確的數字...沒有?

如果是這樣,那麼我們有8個重要!

所以爲什麼 msdn說:7?

enter image description here

問題#2

在雙存在用於尾數52位。 (0..51)

如果我添加1所述的歸一化的尾數,以便它的2^53 possibilites它是:9007199254740992(16位)

和MS不說:15-16:

enter image description here

爲什麼這種不一致?我錯過了什麼嗎?

回答

4

它不會再添加一個十進制數字 - 只是一個二進制數字。因此,而不是23位,你有24位。這很方便,因爲你無法用一個數字開頭的唯一數字是零,這是一個特殊的值。

總之,你不看2^24(這將是一個十進制數,基數爲10) - 你正在尋找2^(-24)。這是float - doubledecimal之間最重要的區別。 decimal就是你想象的那樣,即。一個簡單的指數移位的基數爲10的數字。 floatdouble是不是。

現在,十進制數字與二進制數字是一個棘手的問題。您的錯誤理解是:精度與2^24的數字有關 - 只有在您討論例如decimal類型,它實際上存儲十進制值作爲正常(巨驢)整數的小數點偏移量。

就像1/3不能用十進制寫(0.333333...),許多簡單的十進制數不能用精確的浮點數表示(0.2就是典型的例子)。 decimal沒有問題 - 這只是2向右移一位數,容易鬆動。但是,對於浮點數,您必須將此值表示爲兩個負的冪的和 - 0.5,0.25, 0.125 ...如果2不是10的因子 - 每個有限二進制「十進制「可以用十進制的有限精度表示。

現在,事實上,float可以很容易地代表一個24位十進制數字 - 它只需要2^(-24) - 在日常工作中你不會遇到的數字,以及十進制中奇怪的數字。那麼7(實際上更像7.22...)從哪裏來?很簡單,只需做一個2^(-24)的小數對數。

看起來0.2float中可以「完全」表示的事實很簡單,因爲每次你把它轉換成一個字符串,你四捨五入。所以,即使這個數字不是準確的,它會以這種方式轉換成十進制數。

所有這一切意味着當你需要小數精度時,你想使用decimal,就這麼簡單。這不是因爲它是一個更好的計算基礎,它只是因爲人們使用它,如果你的應用程序在一張紙上計算出不同的結果,他們就不會高興 - 尤其是在處理金錢時。會計師非常專注於讓一切正確到最低有效位。

浮點數用於不是十進制精度的地方,而是通常具有某種精度 - 這使得它們非常適合物理計算和類似的工作,因爲您實際上並不關心數字是否相同以十進制表示 - 您正在使用給定的精度,並且您將獲得 - 24個重要的二進制「小數」。

+0

它沒關係 - 它是一個數字。我已經知道decimal是_decimal_浮點數vs float/double,它是_binary_浮點數。但仍然 - 都代表價值。 95%的答案解釋不相關的信息(0.333,十進制與浮點數,減去功率,人類讀取十進制.....)。 2^24 vs 2^-24,這並不重要 - 尾數的工作是提供顯着的數字。 –

+0

@RoyiNamir浮點型尾數的工作是提供重要的*二進制*數字。 '1.1111111f.ToString(「f10」)'會給你'「1.111111」 - 「有保證的」7個十進制數字。但是,'1.1920928955078125.ToString(「f20」)'會給你17個十進制數字。你的問題很清楚你*不瞭解'decimal'和'float'之間的區別('所以我們可以代表2^23個數字(通過23位):即8388608 - >這是7位長.')。 – Luaan

+0

23位,我可以表示最大值:'2^23 - 1' - 它沒關係我放在哪裏。這是指數工作。無論如何 - 你可以去聊天嗎? HTTP://chat.stackoverflow。COM /間/ 51161 /餘地royi-納米爾和-luaan –

1

隱含的前導1增加了一個二進制數字的精度,而不是十進制。