2013-04-29 44 views
1

ISO/IEC 9899:2011 §5.2.4.2.2 ¶10(P48)表示:「符合標準的編譯器可能選擇不執行非標準化浮點數」的意義是什麼?

次正規數的存在或不存在的特徵在於FLT_HAS_SUBNORMDBL_HAS_SUBNORM, 和LDBL_HAS_SUBNORM的 實現定義的值:

-1不確定
0不存在(類型不支持低於正常數字)
1目前(類型確實支持次正常數字)

什麼!所以在一些平臺上我不能寫double d = 33.3?或者編譯器會自動將其轉換爲333E-1存在或不存在非標準化浮點數的實際意義是什麼?

+3

您需要了解[subnormal number](http://en.wikipedia.org/wiki/Denormal_number)是什麼。 – 2013-04-29 13:52:44

+2

33.3和333E-2都不是任何正常實現浮點算法的低於正常數的數。假設您正在使用IEEE 754浮點運算,則子正常數字的指數等於最小可能的指數,並且尾數以0位開始,而不是像正常數字中的1位開始。前導1位通常是隱含的;它沒有物理存儲。換句話說,低於正常的數字是微小的。 – 2013-04-29 14:03:39

回答

7

次正規號碼-FLT_MINFLT_MIN(對於類型float)和-DBL_MINDBL_MIN(對於double類型)之間的非零浮點數。常數FLT_MIN通常是1.17549435E-38F,即。如果您只使用浮點數編程一點點,您可能永遠不會遇到一個低於正常數。在編譯平臺FLT_HAS_SUBNORM == 0上,只有數字+0。和-0。在-FLT_MINFLT_MIN之間。

低於正常數字通常在軟件中處理(因爲他們有特殊的行爲,並不經常發生)。根本不處理它們的一個原因是避免它們發生時可能發生的放緩。這在實時環境中很重要。

下一代英特爾臺式機處理器世代(或者它是現在的?)將處理硬件中的低於正常水平。

低於正常數的概念與符號33.3333E-1無關,這些符號代表相同的double值。

在這些reminiscences中,在「Gradual Underflow」下可以找到IEEE 754中的次正規的理由和它們的標準化歷史。

編輯:

我無法找到英特爾處理次歸在硬件在其下一代處理器的來源,但我發現一個Nvidia's Fermi platform doing so already

+2

+1鏈接! – 2013-04-29 14:04:20

+1

一個小問題:'33.3'和'333E-1'是兩個不同的*浮點文字,表示相同的'double' *值*。 – 2013-04-29 14:42:37

+0

@凱特湯普森謝謝。 – 2013-04-29 14:46:44