2015-08-23 45 views
5

如果我只有32位機器,那麼cpu如何計算雙精度數字?這個數字是64位寬。 FPU如何處理它?32位機器如何計算雙精度數字

更一般的問題是,如何計算更廣泛的東西,然後我的alu。但我完全理解整數的方式。你可以簡單地split他們。然而,對於浮點數,你有指數和尾數,這應該被不同地處理。

+0

它只是*複雜*比int64,但可以處理2個32位數據。 – Jarod42

回答

9

並非所有「32位機器」都必須是32位。 x87型FPU從一開始就不是「32位」,這是AMD64創建之前的很長一段時間。它總是能夠在80位擴展雙精度上進行數學運算,而且它曾經是一個單獨的芯片,所以根本沒有機會使用主ALU。

它比ALU寬,但它不通過ALU,浮點單元使用它們自己的電路,這些電路的寬度與它們需要的寬度相同。這些circuits也比整數電路複雜得多,並且它們不與整數ALU在它們的組件中真正重疊

+0

好吧,這就是我的想法。要麼FPU能夠做到這一點,因爲它的設計很少額外,或者是由軟件完成的,它解決了編譯器 – hr0m

1

甚至8位計算機通過編寫代碼來執行擴展精度(80位)浮點運算。

現代32位計算機(x86,ARM,較舊的PowerPC等)具有32位整數和64或80位浮點硬件。

+0

如果32位計算機只有32位浮點硬件會怎樣?然後怎樣呢? (多數民衆贊成在有趣的部分:) – hr0m

1

讓我們先看看整數算術,因爲它更簡單。在你的32位ALU內部,有32個單獨的邏輯單元帶有進位位,會溢出鏈條。 1 + 1 - > 10,進位但轉到第二個邏輯單元。整個ALU也會有一個進位位輸出,你可以用它來做任意長度的數學運算。寬度的唯一真正限制是您可以在一個週期內處理多少位。要做64位數學運算,需要2個或更多的週期,並且需要自己完成進位邏輯。

+0

是的,據我所知,正如我已經寫過的那樣。但是如何處理浮點?那不是那麼簡單,因爲這個數字是內部分解成指數和mantisse的。 – hr0m

+1

@ hr0m你分割它們,然後使用這些任意的精度例程在有效數字上進行數學運算。指數和符號很容易適合正常類型。手動完成所有規範化和舍入等操作有點複雜,但可以完成。基本上,遵循硬件算法,但採用更軟件的方式(如迭代和分支)。 – harold

1

似乎這個問題只是「FPU如何工作?」,而不管位寬度如何。

FPU做加法,乘法,除法等等。它們每個都有不同的算法。

加成

(也減法)
給定兩個數字與指數和尾數:

  • X1 = m1 * 2^e1
  • X2 = m2 * 2^e2

,第一步是歸一化:

  • X1 = m1 * 2^e1
  • X2 = (m2 * 2^(e2 - e1)) * 2^e1(假設E2> E1)

然後可以添加尾數:

  • X1 + X2 = (whatever) * 2^e1

然後,應該將結果轉換爲有效的尾數/指數形式(例如,(不管))部分可能是需要的編輯在2^23和2^24之間)。如果我沒有弄錯,這就是所謂的「重整化」。這裏還應該檢查溢出和下溢。

乘法

只需乘以尾數並加上指數即可。然後重新規格化相乘的尾數。

請在尾數是「長除法」的算法,然後減去的指數。重整化可能不是必要的(取決於你如何實施長分工)。

正弦/餘弦

轉換輸入到範圍[0 ...π/ 2],然後在其上運行的算法CORDIC

等等
+1

沒問題,可以用硬件完成,即使在32位計算機上也可以。我理解數學概念。我明白它是如何在軟件中完成的。不過謝謝你的總結 – hr0m

2

有在計算機體系結構,可以在比特來測量的幾個不同的概念,但它們都沒有防止在處理64位浮點數。雖然這些概念可能是相互關聯的,但對於這個問題,這是值得考慮的。

通常,「32位」意味着地址是32位。這將每個進程的虛擬內存限制爲2^32個地址。這是對程序最直接的區別,因爲它會影響指針的大小和內存數據的最大大小。這與處理浮點數完全無關。

另一個可能的含義是在內存和CPU之間傳輸數據的路徑的寬度。這不是對數據結構大小的硬性限制 - 一個數據項可能需要多次傳輸。例如,Java語言規範不要求原子加載和doublelong的存儲。見17.7. Non-Atomic Treatment of double and long。 A double可以使用兩個獨立的32位傳輸在內存和處理器之間移動。

第三個含義是通用寄存器大小。許多架構使用單獨的寄存器來實現浮點。即使通用寄存器只有32位,浮點寄存器也可以更寬,或者可以將兩個32位浮點寄存器配對爲一個64位數。

這些概念之間的典型關係是具有64位存儲器地址的計算機通常具有64位通用寄存器,因此指針可以放入一個通用寄存器中。