簡體   English   中英

32位機器如何計算雙精度數

[英]How does a 32-bit machine compute a double precision number

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

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

並非“32位機器”中的所有內容都必須為32位。 x87風格的FPU從一開始就不是“32位”,這是AMD64創建之前很長一段時間。 它始終能夠在80位擴展雙精度數字上進行數學運算,並且它曾經是一個單獨的芯片,因此根本沒有機會使用主ALU。

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

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

通常,“32位”表示地址是32位。 這將每個進程的虛擬內存限制為2 ^ 32個地址。 它是對程序產生最直接差異的度量,因為它會影響指針的大小和內存數據的最大大小。 它與浮點數的處理完全無關。

另一個可能的含義是在內存和CPU之間傳輸數據的路徑的寬度。 這不是對數據結構大小的硬性限制 - 一個數據項可能需要多次傳輸。 例如,Java語言規范不需要原子載荷和doublelong存儲。 17.7。 雙原子和非原子的非原子化處理 可以使用兩個單獨的32位傳輸在內存和處理器之間移動double

第三個含義是通用寄存器大小。 許多架構使用單獨的寄存器用於浮點。 即使通用寄存器僅為32位,浮點寄存器也可以更寬,或者可以將兩個32位浮點寄存器配對以表示一個64位數。

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

即使8位計算機也提供擴展精度(80位)浮點運算,通過編寫代碼進行計算。

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

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

似乎問題只是“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算法。

等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM