如果我只有32位機器,那麼cpu如何計算雙精度數字?這個數字是64位寬。 FPU如何處理它?32位機器如何計算雙精度數字
更一般的問題是,如何計算更廣泛的東西,然後我的alu。但我完全理解整數的方式。你可以簡單地split他們。然而,對於浮點數,你有指數和尾數,這應該被不同地處理。
如果我只有32位機器,那麼cpu如何計算雙精度數字?這個數字是64位寬。 FPU如何處理它?32位機器如何計算雙精度數字
更一般的問題是,如何計算更廣泛的東西,然後我的alu。但我完全理解整數的方式。你可以簡單地split他們。然而,對於浮點數,你有指數和尾數,這應該被不同地處理。
甚至8位計算機通過編寫代碼來執行擴展精度(80位)浮點運算。
現代32位計算機(x86,ARM,較舊的PowerPC等)具有32位整數和64或80位浮點硬件。
如果32位計算機只有32位浮點硬件會怎樣?然後怎樣呢? (多數民衆贊成在有趣的部分:) – hr0m
讓我們先看看整數算術,因爲它更簡單。在你的32位ALU內部,有32個單獨的邏輯單元帶有進位位,會溢出鏈條。 1 + 1 - > 10,進位但轉到第二個邏輯單元。整個ALU也會有一個進位位輸出,你可以用它來做任意長度的數學運算。寬度的唯一真正限制是您可以在一個週期內處理多少位。要做64位數學運算,需要2個或更多的週期,並且需要自己完成進位邏輯。
似乎這個問題只是「FPU如何工作?」,而不管位寬度如何。
FPU做加法,乘法,除法等等。它們每個都有不同的算法。
(也減法)
給定兩個數字與指數和尾數:
m1 * 2^e1
m2 * 2^e2
,第一步是歸一化:
m1 * 2^e1
(m2 * 2^(e2 - e1)) * 2^e1
(假設E2> E1)然後可以添加尾數:
(whatever) * 2^e1
然後,應該將結果轉換爲有效的尾數/指數形式(例如,(不管))部分可能是需要的編輯在2^23和2^24之間)。如果我沒有弄錯,這就是所謂的「重整化」。這裏還應該檢查溢出和下溢。
只需乘以尾數並加上指數即可。然後重新規格化相乘的尾數。
請在尾數是「長除法」的算法,然後減去的指數。重整化可能不是必要的(取決於你如何實施長分工)。
轉換輸入到範圍[0 ...π/ 2],然後在其上運行的算法CORDIC。
等等沒問題,可以用硬件完成,即使在32位計算機上也可以。我理解數學概念。我明白它是如何在軟件中完成的。不過謝謝你的總結 – hr0m
有在計算機體系結構,可以在比特來測量的幾個不同的概念,但它們都沒有防止在處理64位浮點數。雖然這些概念可能是相互關聯的,但對於這個問題,這是值得考慮的。
通常,「32位」意味着地址是32位。這將每個進程的虛擬內存限制爲2^32個地址。這是對程序最直接的區別,因爲它會影響指針的大小和內存數據的最大大小。這與處理浮點數完全無關。
另一個可能的含義是在內存和CPU之間傳輸數據的路徑的寬度。這不是對數據結構大小的硬性限制 - 一個數據項可能需要多次傳輸。例如,Java語言規範不要求原子加載和double
或long
的存儲。見17.7. Non-Atomic Treatment of double and long。 A double
可以使用兩個獨立的32位傳輸在內存和處理器之間移動。
第三個含義是通用寄存器大小。許多架構使用單獨的寄存器來實現浮點。即使通用寄存器只有32位,浮點寄存器也可以更寬,或者可以將兩個32位浮點寄存器配對爲一個64位數。
這些概念之間的典型關係是具有64位存儲器地址的計算機通常具有64位通用寄存器,因此指針可以放入一個通用寄存器中。
它只是*複雜*比int64,但可以處理2個32位數據。 – Jarod42