我對這些事情很好奇:
- C 語言是否總是以規范化形式存盤浮點數?(也就是說,是否始終應用歸一化?)
- 這是否也適用于經過一些算術(加法、乘法)后獲得的結果?
- 它依賴于語言還是硬體 - FPU?
如果您可以參考任何來源,那將非常有幫助。我查看了 IEEE-754 檔案,但找不到任何關于實作的具體宣告。
編輯:假設 IEEE-754 規范
uj5u.com熱心網友回復:
C 語言是否總是以規范化形式存盤浮點數?
“這取決于。” 正如我們將看到的,決定這一點的是硬體而不是 C 語言。
如果實作使用IEEE-754以外的其他東西,我們無話可說。
如果實作確實使用了 IEEE-754,那么所有數字總是被標準化存盤,除了那些不是,即subnormals。
這是否也適用于經過一些算術(加法、乘法)后獲得的結果?
是的。(更多關于這個下面。)
它依賴于語言還是硬體 - FPU?
它通常取決于硬體。大多數情況下,假設目標處理器完全支持浮點,C 程式直接編譯為本機浮點指令,沒有任何語言或編譯器強加的額外處理。(這與 Java 形成對比,Java 確實具有語言強加的浮點定義,部分由 JVM 實作。)
C 標準確實有一個可選部分,“Annex F”,它指定了一系列符合 IEEE-754 的特定浮點行為。
現在,如果C 實作采用 Annex F 并符合 IEEE-754(通常是因為底層硬體也是如此),那么前兩個問題的答案就變得更容易了。在 IEEE-754 二進制算術中,除了一個例外,表示沒有歧義。每一個可以用歸一化形式表示的數字都只有一個歸一化表示。每個不能以規范化形式表示但可以表示為次規范的數字,都只有一個次規范表示。這些約束適用于每個 IEEE-754 浮點數,包括(很自然地)其他運算的結果。
(例外,正如 Eric 和 Chux 在評論中提醒我的那樣,為零,IEEE-754 有兩個,正面和負面。)
所以答案是“結果是否總是標準化的?” 是“否”(因為 IEEE-754 肯定有那些次正規數,當然還有零),但如果問題是“每個數字都有唯一的表示形式嗎?”,答案大多是“是”。(同樣,零除外。或者,如果您是少數使用 IEEE-754-2008十進制格式做某事的人之一,這些格式不太獨特。)另請參閱如何區分 1 和零浮點數-點值?
我想,最后一個問題是“有多少 C 實作采用了 Annex F?”,或者換一種說法,“有多少處理器符合 IEEE-754?” 對于通用計算機(大型機和個人計算機)上的 CPU,據我所知,現在的答案是“全部”。另一方面,GPU 故意與 IEEE-754 不太兼容(因為這樣它們可能會更加高效)。微處理器,對于“嵌入式”作業,我不太確定。(通常他們根本沒有可行的浮點數。)
uj5u.com熱心網友回復:
如果您可以參考任何來源,那將非常有幫助。
C 2018 5.2.4.2.2 3 將數x的浮點表示定義為x = sb e Σ 1≤= k ≤ p f k b ? k,其中s是符號 (±1),b是基數,ê是在從范圍內的整數指數?分鐘至è最大值,p是精度(數目的堿基b位數),和?F ?是堿基b的有效數位。
然后第4段說:
除了規范化的浮點數(如果x ≠ 0,則f 1 > 0 ),浮點型別可能能夠包含其他型別的浮點數,例如次正規浮點數 ( x ≠ 0, e = e min , f 1 = 0) 和未歸一化的浮點數(x ≠ 0, e > e min , f 1 = 0),以及非浮點數的值,例如無窮大和 NaN……
這就對了; 除了附件 F 提供了對 IEC 60559(實際上是 IEEE 754)的可選系結之外,C 標準對浮點數的規范化保持沉默。所以這回答了以下問題:
C 語言是否總是以規范化形式存盤浮點數?(也就是說,是否始終應用歸一化?)
不。
這是否也適用于經過一些算術(加法、乘法)后獲得的結果?
不。
它依賴于語言還是硬體 - FPU?
這取決于每個 C 實作。C 實作可能受硬體影響,也可能采用浮點演算法的軟體實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/361328.html
