IEEE 754 浮點數 binary32 或 binary64 的值以 1 個符號位元、一個偏置指數欄位和一個尾數欄位儲存,而IEEE 754 浮點數轉換器可讓你在瀏覽器中對 IEEE 754 浮點數值進行進位轉換,將十進位數編碼至這些精確欄位,或將位元與十六進位模式解碼回瀏覽器的數字。對於 binary32,其配置為 1 個符號位元、8 個指數位元和 23 個尾數位元,指數偏置為 127,並以 8 位數十六進位交換字串表示,以最高有效位元組優先撰寫。對於 binary64,其配置為 1 個符號位元、11 個指數位元和 52 個尾數位元,指數偏置為 1023,並以 16 位數十六進位交換字串表示,同樣以最高有效位元組優先撰寫。每次轉換都透過瀏覽器的 DataView API,以 big-endian 位元組順序呼叫 setFloat32 或 setFloat64 執行,因此你所看到的位元和十六進位,正是瀏覽器本身所儲存的位元。在將該值傳送至預期特定 IEEE 754 配置的網路協定、檔案格式或硬體暫存器之前,請使用轉換器檢查符號、指數、尾數、分類、四捨五入後的儲存值,以及完整的十六進位交換格式。

base convert ieee 754 floating point
base convert ieee 754 floating point

IEEE 754 binary32 與 binary64 欄位配置

binary32 與 binary64 皆遵循 IEEE 754-2019 的結構,包含 1 個符號位元、一個偏置指數和一個尾數部分,但兩者的欄位寬度和偏置常數不同。下表摘要說明這兩種配置,以協助你為將讀取輸出的消費者挑選正確的寬度。

屬性binary32 (單精度)binary64 (雙精度)
總寬度32 位元64 位元
符號位元寬度1 位元1 位元
指數寬度8 位元11 位元
尾數寬度23 位元52 位元
指數偏置1271023
十六進位位數 (MSB 優先)816
正規值的未偏置指數儲存值減 127儲存值減 1023
次正規值的未偏置指數1 減 1271 減 1023

IEEE 754 標準保留全為零的指數模式用於零和次正規值,並保留全為 1 的指數模式用於無限大和 NaN。介於兩者之間的則為正規數,其尾數部分帶有隱含的前導 1。當你需要將相同的邏輯對應至半精度、四精度或該標準定義的任何其他寬度時,可於IEEE 754-2019 標準中確認精確的寬度和保留模式。

將十進位值編碼為 IEEE 754 位元

  1. 開啟轉換器並選擇 decimal-to-bits (十進位到位元) 方向,然後選擇 binary32binary64 作為目標精度。
  2. 以一般十進位表示法輸入一個值。可接受選擇性的前導符號、小數部分,以及十進位指數 (例如 1.5e-3);也接受 Infinity、-Infinity 和 NaN。十六進位符記、逗號、單位和地區語系的小數分隔符號會刻意被拒絕,以避免解析器默默強制轉型輸入內容。
  3. 從結果面板讀取儲存值、符號位元、儲存指數、尾數、分類 (零、次正規、正規、無限大或 NaN)、未偏置指數、完整的位元字串,以及十六進位交換格式。對於 binary32,位元字串為 32 位數,十六進位為 8 位數;對於 binary64,位元字串為 64 位數,十六進位為 16 位數,兩者皆以最高有效位元組優先。
  4. 使用複製功能取得不含 0x 標籤的十六進位數字,然後貼到你的程式碼、協定或固定資料檔案中。

編碼路徑會透過 DataView.setFloat32 或 DataView.setFloat64,以 big-endian 位元組順序寫入 JavaScript Number,接著再讀回儲存值,這就是為何 binary32 會顯示雙精度輸入縮減為單精度時所發生的四捨五入結果。作為實作範例,將 1.0 以 binary64 編碼會產生位元字串 0 01111111111 0000000000000000000000000000000000000000000000000000:符號位元為 0,儲存指數為 01111111111 (十進位 1023,即偏置 1023 加上未偏置指數 0),尾數全為零,十六進位交換值為 3FF0000000000000。你原始輸入中的任何四捨五入或精度損失都會直接顯示在這些欄位中。

將位元或十六進位解碼回數字

  1. 將轉換器切換至 bits-or-hex-to-decimal (位元或十六進位到十進位) 方向,並挑選 binary32binary64,以便解析器預期相符的長度。
  2. 對於 binary32 輸入剛好 32 個二進位位數或 8 個十六進位位數;對於 binary64 輸入剛好 64 個二進位位數或 16 個十六進位位數。十六進位形式可選擇性地加上前導 0x。其他長度會被拒絕,以避免部分輸入產生誤導的儲存值。
  3. 檢查還原後的儲存值、符號、儲存指數、尾數、分類、未偏置指數,以及輸入的位元模式。即使儲存值塌縮為 NaN 等特殊值,輸入的符號、指數和尾數欄位仍會持續顯示。
  4. 若解碼後的值為 NaN,請記得 ECMAScript 會將每個 NaN 酬載 (payload) 全部呈現為單一值 NaN。輸入的位元會保留在畫面上,但僅憑數值本身無法區分不同的 NaN 酬載。

此路徑會將輸入的位元寫入 ArrayBuffer,並透過與編碼時相同的 DataView 呼叫讀回對應的浮點數,進而端對端保留位元模式。以符號 1、指數全為零、尾數為零編碼的負零會解碼回 -0,即使其在一般算術中與正零比較結果相等,仍會與正零保持區隔。

分類與特殊值

IEEE 754 會根據指數和尾數欄位 (而非數值本身) 對每個位元模式進行分類。下列規則同時適用於 binary32 和 binary64,僅欄位寬度有所差異。

分類指數欄位尾數欄位未偏置指數
全為零全為零不顯示 (特殊)
次正規全為零非零1 減偏置 (例如 1 減 127)
正規非零,且非全為 1任意儲存值減偏置
無限大全為 1全為零不顯示 (特殊)
NaN全為 1非零不顯示 (特殊)

轉換器會直接回報分類,而不會為無限大或 NaN 捏造一個未偏置指數,因為這些屬於特殊值,並非具有有限指數的一般數字。正零與負零共用相同的尾數和指數,僅在符號位元上有所不同,而該符號在倒數等運算中可能產生不同的結果,這就是為何當輸入或解碼 -0 時,頁面會將其保留下來。

為何精度與位元組順序至關重要

許多十進位分數,包括常見的 0.1,需要無限的二進位展開,並在以 binary32 或 binary64 儲存時四捨五入至最接近的可表示值。較大的整數在 binary64 中也可能喪失最低位元的精度,而 binary32 會更快喪失精度。轉換器會同時顯示原始輸入與儲存值,讓該四捨五入結果一目了然,但位元模式本身並不能證明該十進位值是精確的。當某個領域需要精確的金額、識別碼或任意精度時,請使用十進位或整數程式庫,而不是原始的 IEEE 754 浮點數。

位元組順序是第二個你必須遵守的契約。轉換器以 big-endian 順序進行讀寫,這與未傳入 endian 參數的 DataView.setFloat32 和 setFloat64 一致。若你的協定、檔案格式或硬體預期為 little-endian 浮點數,請在寫入前先交換位元組,否則結果將會默默地顛倒過來。工具內建了 8 個外部固定資料 (fixtures),涵蓋 binary32 的 1、負零、正無限大、最大有限值、最小正次正規值,以及 binary64 的 1、負零和 pi,並針對次正規、無限大、NaN 和二進位輸入邊界提供額外測試。

與實際消費者進行驗證

請將轉換器輸出的位元模式與十六進位視為一項契約,而非自由格式的表示。請將它們與將讀取該值的語言執行階段、檔案格式、網路協定或硬體規格進行比對,特別留意位元組順序、寬度,以及消費者處理 NaN 酬載和負零的方式。若消費者是 C 結構、Java Float、WebAssembly 記憶體配置或二進位日誌檔,其浮點數規則與位元組順序必須與轉換器所產生的內容相符。當其中任何一項不相符時,應在轉換器端 (而非下游程式碼中) 找出差異,因為每個步驟都透過瀏覽器用於浮點數交換的相同 DataView 呼叫在本機執行。

如需更深入的說明,請參閱將十進位數字轉換為 IEEE 754 浮點數格式