2012-08-25 40 views
18

我讀過很多關於浮動的東西,但都是不必要的參與。我認爲我找到了非常清楚,但是有一兩件事我想知道肯定:在二進制浮點中可以表示什麼類型的數字?

我知道,形式1/pow(2,n)的分數,與n一個整數,可以準確地代表在浮點數字中。這意味着如果我自己增加1/32,3200萬次,我會得到1,000,000

怎麼樣像1/(32+16)?這是兩個兩個冪的總和,這是否工作?或者是1/32+1/16有效嗎?這是我困惑的地方,所以如果任何人都可以澄清對我來說,我將不勝感激。

回答

27

該規則可以被概括爲這樣:

  • 一些可以以二進制精確表示如果分母的素數因數分解僅包含2(即,分母爲冪的2)

因此1/(32 + 16)不能用二進制表示,因爲它在分母中有一個因子3。但1/32 + 1/16 = 3/32是。

也就是說,有更多限制可以在浮點類型中表示。例如,在IEEE double中只有53位尾數,因此1/2 + 1/2^500不可表示。

所以,只要指數的範圍不超過53次冪,您就可以完成兩次冪的和。


爲了概括這對其他基地:

  • 數字可以在基體10精確表示如果分母的素數因數分解僅由2的和5的。

  • 有理數X可以在鹼N精確表示如果X分母的素數因數分解僅包含在N因式分解發現素數。

+3

所以如果我有這個權利,只要'Y'是2的冪和'X'是小於'2^53'的數字,我就可以使用任何數字'X/Y'? –

+2

是的,這是正確的。 (禁止超過/下溢案件) – Mysticial

+0

@Mysticial:答案爲+1,但我有疑問。 24/48 = 0.5,但是通過上述規則,它不應該是可表示的,因爲3是48的主要因素之一,它不是10的主要因素之一。爲什麼? – legends2k

4

浮點數使用形式字面上表示:

1.m * 2^e 

1.m是一個二進制分數和e是正或負的整數。

這樣,可以表示1/32 + 1/16準確,作爲:(1.10作爲二進制小數相當於1.5)

1.1000000 * 2^-4 

1/48,但是,並不以這種格式無法表示。

+0

(我想你的意思是'1.m * 2^e'。) – huon

+0

Derp。當然是。 :) – duskwuff

+0

不應該是'1.1000000 * 2^-4'嗎? – mkeiser

0

尚未提及的一點是,在語義上,浮點數可能最好被認爲代表一個值的範圍。值的範圍有一個非常精確定義的中心點,而IEEE規範通常要求浮點計算的結果是其範圍中包含原始數字中心點的點的數字,但在序列中:

 
    double N1 = 0.1; 
    float N2 = (float)N1; 
    double N3 = N2; 

N2是,曾在N1被代表的價值的明確正確的單精度表示,儘管語言的使用有明確的轉換無聊要求。 N3將代表N2可以表示的值之一(語言規格恰好選擇double的值,其範圍集中在float的範圍的中間)。請注意,雖然N2表示其範圍包含正確值的類型值,但N3不包含。

順便提一下,在.net和.net語言中將數字從字符串轉換爲浮點數似乎要經歷中間轉換爲double,這有時可能會改變該值。例如,即使值13571357可以表示爲單精度浮點型,但值13571357.499999999069f的四捨五入爲13571358(儘管它明顯更接近於13571357)。

+0

1.「語言愚蠢的要求使用明確的演員」:你在說哪種語言? C在這裏不需要演員...... – glglgl

+0

@glglgl:引用的示例代碼將在C,Java或C#中有效;後兩種語言都要求演員'浮動',儘管不是'雙'。 – supercat

+0

好的,謝謝。評論2.不再適用,我想了一下字符串 - > double - > float轉換,看起來你就在這裏。 – glglgl

8

有限數量可以在公共IEEE 754雙精度格式來表示當且僅當它等於M•2 ë對於某些整數m和e,使得-2 <中號和-1074≤Ë≤971

對於單精度,-2 <中號和-149≤Ë≤104

對於雙精度,這是由於雙精度格式使用52位來存儲有效數(由於隱含1而通常具有53位)並使用11位來存儲指數的事實的結果。 11位對從0到2047的數字進行編碼,但爲了特殊目的,0和2047被排除,並且編碼的數字被偏置1023,因此它表示從-1022到1023的無偏指數。但是,這些無偏指數用於區間中的有效數[1,2],那些有意義的分數。爲了將有效數表示爲整數,我將指數範圍調整了52.單精度是相似的,其中23位存儲24位有效位,8位用於指數,偏差爲127.

表達使用整數乘二的冪的可表示數而不是更常見的小數有效數簡化了一些數論和有關浮點性質的其他推理。我在這個答案中使用了它,因爲它允許簡明地表達一組可表示的值。

+0

看到這正是我在我的問題中提到的「過於深入」的那種...... –

+2

@Kolink:答案本身是一個單獨的句子,只使用熟悉的整數概念來確切指出哪些數字可以表示和不能表示,乘法,乘方和小於(或等於)。你能得到多少簡單?你有一個整數次冪的二次方,整數和冪必須在一定範圍內。答案的其餘部分只是解釋句子來自哪裏。 –

+1

+1。編輯修正e的上限。 –

相關問題