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。 值 2 127 大致相當於 10 38 ,這是單精確度的實際限制。

符號會儲存為表單的二進位分數,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 的 是正負號位。 最左邊的位採用單精確度和雙精確度格式。

若要正確移動二進位點,請先將指數不偏向,然後將二進位點移至右邊或向左移動適當的位數。

特殊值

浮點格式包含一些特別處理的值。

零無法正規化,這使得它無法以單精確度或雙精確度值的正規化形式呈現。 所有零的特殊點陣圖樣代表 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 * 2 1 0100 0000 0000 0000 0000 0000 0000 0000 0x40000000
  • 值 -2。 與 +2 相同,不同之處在于已設定符號位。 所有 IEEE 格式浮點數的負數也是如此。

    公式 二進位標記法 十六進位
    -2 -1 * 2 1 1100 0000 0000 0000 0000 0000 0000 0000 0xC0000000
  • 值 4。 相同的正負數,指數增加一個(偏差值為 129,或二進位中的 100 0000 1。

    公式 二進位標記法 十六進位
    4 1 * 2 2 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 1111 1 小於 2。

    公式 二進位標記法 十六進位
    1 1 * 2 0 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 * 2 1 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

另請參閱

浮點數會失去精確度的原因