IEEE 754 浮點數 binary32 或 binary64 值以一個正負號位元、一個偏置指數欄位以及一個分數欄位儲存,而 IEEE 754 浮點數轉換器可讓您在瀏覽器中對 IEEE 754 浮點數進行進位轉換,將十進位數編碼至這些精確欄位,或將位元與十六進位模式解碼回瀏覽器數值。對於 binary32,其配置為一個正負號位元、八個指數位元以及 23 個分數位元,指數偏置值為 127,並以最高有效位元組優先的順序寫成一個八位數的十六進位互換字串。對於 binary64,其配置為一個正負號位元、11 個指數位元以及 52 個分數位元,指數偏置值為 1023,並同樣以最高有效位元組優先的順序寫成一個 16 位數的十六進位互換字串。每次轉換都透過瀏覽器的 DataView API 以大端序位元組順序執行 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 的結構,包含一個正負號位元、一個偏置指數以及一個尾部分數,但兩者的欄位度與偏置常數有所不同。下表摘要說明這兩種配置,以便您為將讀取輸出的消費者挑選正確的寬度。

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

IEEE 754 標準保留了全為零的指數模式用於零與次正規值,並保留了全為一的指數模式用於無限大與 NaN。其間的所有模式皆為正規數,且分數中具有隱含的前導 1。當您需要將相同邏輯對應至半精度、四精度或標準所定義的任何其他寬度時,可至 IEEE 754-2019 標準確認精確的寬度與保留模式。

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

  1. 開啟轉換器並選擇 十進位至位元 方向,接著選擇 binary32 或 binary64 作為目標精度。
  2. 以一般十進位表示法輸入一個值。可接受選擇性的前置正負號、小數部分,以及如 1.5e-3 的十進位指數;亦接受 Infinity、-Infinity 與 NaN。十六進位代號、逗號、單位以及地區設定的小數分隔符號會刻意遭到拒絕,以避免解析器在無聲中強制轉換輸入內容。
  3. 於結果面板中讀取儲存值、正負號位元、儲存指數、分數、分類(零、次正規、正規、無限大或 NaN)、未偏置指數、完整位元字串以及十六進位互換形式。對於 binary32,位元字串為 32 位數,十六進位為八位數;對於 binary64,位元字串為 64 位數,十六進位為 16 位數,兩者皆以最高有效位元組優先的順序排列。
  4. 使用複製功能取得不含 0x 標籤的十六進位數字,再將其貼至您的程式碼、通訊協定或測試固定檔案中。

編碼路會透過大端序位元組順序的 DataView.setFloat32 或 DataView.setFloat64 寫入 JavaScript Number,接著讀回儲存值,這正是 binary32 會揭示雙精度輸入在縮減為單精度時所發生四捨五入的原因。作為具體範例,將 1.0 以 binary64 編碼會產生位元字串 0 01111111111 0000000000000000000000000000000000000000000000000000:正負號位元 0、儲存指數 01111111111(十進位 1023,即偏置值 1023 加上未偏置指數 0)、分數全為零,且十六進位互換為 3FF0000000000000。您原始輸入中的任何四捨五入或精度損失都會直接顯示於這些欄位中。

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

  1. 將轉換器切換至 位元或十六進位至十進位 方向,並挑選 binary32 或 binary64,以便解析器預期相符的長度。
  2. 對於 binary32,請輸入正好 32 個二進位數字或八個十六進位數字;對於 binary64,則輸入正好 64 個二進位數字或 16 個十六進位數字。十六進位形式可選擇性地加上前置 0x。其他長度會遭到拒絕,以免部分輸入產生誤導性的儲存值。
  3. 檢查還原後的儲存值、正負號、儲存指數、分數、分類、未偏置指數以及所輸入的位元模式。即使儲存值塌縮為 NaN 等特殊值,所輸入的正負號、指數與分數欄位仍會保持可見。
  4. 若解碼值為 NaN,請記得 ECMAScript 會將每個 NaN 承載資料公開為單一的 NaN 值。輸入的位元仍會保留於顯示中,但無法僅透過數值區分不同的 NaN 承載資料。

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

分類與特殊值

IEEE 754 根據指數與分數欄位(而非數值本身)來分類每個位元模式。以下規則同樣適用於 binary32 與 binary64,僅欄位寬度有所不同。

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

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

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

許多十進位分數(包括熟悉的 0.1)需要無限的二進位展開,因此在以 binary32 或 binary64 儲存時會四捨五入至最接近的可表示值。大型整數在 binary64 中亦可能喪失單位精度,而 binary32 會更快喪失精度。轉換器透過同時顯示儲存值與原始輸入,使該四捨五入過程清晰可見,但位元模式本身並無法證明十進位值是精確的。當領域要求精確的金額、識別項或任意精度時,請使用十進位或整數程式庫,而非原始的 IEEE 754 浮點數。

位元組順序是您必須遵守的第二項契約。轉換器以大端序進行讀寫,這與 DataView.setFloat32 及 setFloat64 在不指定位元組序參數時的行為一致。若您的通訊協定、檔案格式或硬體預期為小端序浮點數,請在寫入前交換位元組,否則將在無聲中顛倒結果。該工具內建八個外部測試固定案例,涵蓋 binary32 1、負零、正無限大、最大有限值、最小正次正規值,以及 binary64 1、負零與圓周率 pi,並針對次正規、無限大、NaN 與二進位輸入邊界進行額外測試。

與實際消費者進行驗證

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

若想進一步了解,請參閱將十進位數轉換為 IEEE 754 浮點數格式。

若想進一步了解,請參閱在瀏覽器中將十進位轉換為 IEEE 754 並檢查儲存位元。