IEEE 浮點表示
Microsoft C++ (MSVC) 與 IEEE 數值標準一致。 IEEE-754 標準描述浮點格式,這是在硬體中代表實數的方法。 MSVC 編譯程式以目標的硬體表示的浮點數至少有五種內部格式。 編譯程式只會使用其中兩個。 單精度 (4 位元組) 和雙精確度 (8 位元組) 格式用於 MSVC。 單精度是使用 關鍵詞 float
宣告。 雙精確度是使用 關鍵詞 double
宣告。 IEEE 標準也指定半精確度 (2 位元組) 和四精度 (16 位元組) 格式,以及雙擴充精確度 (10 位元組) 格式,其中有些 C 和 C++ 編譯程式實作為long double
數據類型。 在 MSVC 編譯程式中, long double
資料類型會被視為不同的類型,但儲存類型會對應至 double
。 不過,使用其他格式進行計算的內建和元件語言支援,包括硬體支援的雙擴充精確度格式。
這些值會儲存如下:
值 | 儲存為 |
---|---|
單精度 | sign bit, 8 位指數, 23 位符號和 |
雙精確度 | sign bit, 11 位指數, 52 位符號和 |
在單精度和雙精確度格式中,小數部分有前置 1。 小數部分稱為 標誌 (有時稱為 mantissa)。 這個前置 1 不會儲存在記憶體中,因此,即使儲存一個較少的位,但符號實際上是 24 或 53 位。 雙擴充精確度格式實際上會儲存此位。
指數的偏差是其可能值的一半。 這表示您會從預存指數減去此偏差,以取得實際的指數。 如果預存指數小於偏差,它實際上是負指數。
指數有偏差,如下所示:
指數 | 偏差者 |
---|---|
8 位 (單精度) | 127 |
11 位 (雙精確度) | 1023 |
這些指數不是十強的權力:他們是兩個的力量。 也就是說,8 位儲存指數的範圍從 -127 到 127,儲存為 0 到 254。 值 2127 大致相當於 1038,這是單精度的實際限制。
符號會儲存為表單的二進位分數,1.XXX... 。 這個分數的值大於或等於 1 且小於 2。 實數一律以正規化形式儲存。 也就是說,正負號會以左移位,使符號的高階位一律為 1。 由於此位一律為 1,因此會假設為單精度和雙精確度格式(未儲存)。 假設二進位點 (非小數點) 只是前置 1 的右邊。
浮點表示的格式如下所示:
格式 | 位元組 1 | 位元組 2 | 位元組 3 | 位元組 4 | ... | byte n |
---|---|---|---|---|---|---|
單精度 | SXXXXXXX |
XMMMMMMM |
MMMMMMMM |
MMMMMMMM |
||
雙精確度 | SXXXXXXX |
XXXXMMMM |
MMMMMMMM |
MMMMMMMM |
... | MMMMMMMM |
S
表示符號位、 X
' 是偏差指數位,而 M
的 是正負號位。 最左邊的位採用單精度和雙精確度格式。
若要正確移動二進位點,請先將指數不偏向,然後將二進位點移至右邊或向左移動適當的位數。
特殊值
浮點格式包含一些特別處理的值。
Zero
零無法正規化,這使得它無法以單精度或雙精確度值的正規化形式呈現。 所有零的特殊位圖樣代表 0。 您也可以將 -0 表示為零並設定符號位,但 -0 和 0 一律會比較為相等。
Finities
+∞ 和 ∞ 值是以所有值的指數表示,以及所有零的正負值。 正數和負數會使用符號位來表示。
次正規
可以表示小於正規化格式之最小數位的量值。 它們稱為次正規或反正規數位。 如果指數全部為零,而符號為非零,則符號的隱含前置位會被視為零,而不是一個。 次正規數位的精確度會隨著正負數中的前置零數目而下降。
NaN - 不是數位
可以代表不是實數的值,例如 IEEE 浮點數格式的 0 / 0。 這種值稱為 NaN。 NaN 會以所有指數和非零的正負號表示。 有兩種 NaN、 無訊息 NaN 或 QNaN,以及 發出 NaN 或 SNAN 的訊號。 Quiet NaN 在標誌中具有前置的 ,並透過表達式傳播。 它們代表不確定的值,例如除以無限大的結果,或將無限大乘以零。 訊號 NaN 在正負號中具有前置零。 它們用於無效的作業,以發出浮點硬體例外狀況的訊號。
範例
以下是單精度格式的一些範例:
針對值 2,符號位為零。 預存指數是 128,或二進位 1000 0000,也就是 127 加 1。 儲存的二進位正負號為 (1.) 000 0000 0000 0000 0000,其隱含前置 1 和二進位點,因此實際的正負號為一。
值 公式 二進位表示法 十六進位 2 1 * 21 0100 0000 0000 0000 0000 0000 0000 0000 0x40000000 值 -2。 與 +2 相同,不同之處在於已設定符號位。 所有 IEEE 格式浮點數的負數也是如此。
值 公式 二進位表示法 十六進位 -2 -1 * 21 1100 0000 0000 0000 0000 0000 0000 0000 0xC0000000 值 4。 相同的正負數,指數增加一個(偏差值為129,或二進位中的1000000001。
值 公式 二進位表示法 十六進位 4 1 * 22 0100 0000 1000 0000 0000 0000 0000 0000 0x40800000 值 6。 相同的指數,標誌是更大的一半。 是 (1.) 100 0000 ...0000 0000,因為它是二進位分數,所以是 1 1/2,因為小數位數的值是 1/2、1/4、1/8 等等。
值 公式 二進位表示法 十六進位 6 1.5 * 2 2 0100 0000 1100 0000 0000 0000 0000 0000 0x40C00000 值 1。 與兩項其他權力相同,偏差指數在127或二進位中的011 11111 1 小於2。
值 公式 二進位表示法 十六進位 1 1 * 20 0011 1111 1000 0000 0000 0000 0000 0000 0x3F800000 值 0.75。 偏差指數在二進位中為 126, 011 1111 0,而符號為 (1.) 100 0000 ...0000 0000,也就是 1 1/2。
值 公式 二進位表示法 十六進位 0.75 1.5 * 2-1 0011 1111 0100 0000 0000 0000 0000 0000 0x3F400000 值 2.5。 與兩個完全相同,不同之處在於,代表 1/4 的位是在符號中設定。
值 公式 二進位表示法 十六進位 2.5 1.25 * 21 0100 0000 0010 0000 0000 0000 0000 0000 0x40200000 1/10 是二進位中的重複分數。 這一跡象略低於1.6,偏見指數表示,1.6將除以16。 (二進位為 011 1101 1,十進位為 123。true 指數為 123 - 127 = -4,這表示乘以 2-4 = 1/16 的乘積。 儲存的正負號會進位在最後一個位,以盡可能精確地表示無法代表的數位。 (1/10 和 1/100 在二進位中無法完全表示的原因與 1/3 不完全以十進位表示的原因類似。
值 公式 二進位表示法 十六進位 0.1 1.6 * 2-4 0011 1101 1100 1100 1100 1100 1100 1101 0x3DCCCCCD 零是特殊案例。 它會針對可能表示的最小正值使用公式,也就是所有零。
值 公式 二進位表示法 十六進位 0 1 * 2-128 0000 0000 0000 0000 0000 0000 0000 0000 0x00000000