2014-12-27 52 views
2

我想了解點如何浮動轉換爲低電平進行處理。所以根據我的理解,這是用硬件實現的。因此,例如,SSE提供了一個浮子轉換爲int指令cvttss2si在FPU和SSE發明之前如何處理浮點轉換?

但我的問題是:浮點轉換是否總是這樣處理?在FPU和SSE的發明之前,使用匯編代碼手動完成的計算是什麼?

+0

在Intel 80286我使用的8087仿真器(EM87.COM)來自Ron Kimball。現在我在這個頁面上找到了docoment文件:http://docs1.chomikuj.pl/1816123580,PL,0,0,EM87.DOC –

回答

2

這取決於處理器,並且多年來已經有多個不同的處理器。

FPU代表「浮點單元」。這是一個或多或少的通用術語,可以指任何計算機系統的浮點硬件單元。一些系統可能具有內置在CPU中的浮點運算。其他人可能有一個單獨的芯片。但其他人可能根本沒有硬件浮點支持。如果在代碼中指定了浮點轉換,編譯器將生成執行必要計算所需的任何CPU指令。在某些系統上,這可能是對子程序的調用,它會執行任何需要的位操作。

SSE代表「Streaming SIMD Extensions」,並且特定於x86系列CPU。對於非x86的CPU,SSE沒有「之前」或「之後」;上證所根本不適用。

0

從浮點到整數轉換被認爲是一個基本的足夠的操作,所述指令387已經設置了這樣的指令,FIST - 儘管不是有用用於編譯(int)f構建體C程序,作爲指令使用的當前的舍入模式。

一些RISC指令集一直認爲從浮點到整數的專用轉換指令是不必要的奢侈,而且這可以通過訪問IEEE 754浮點表示的幾條指令完成。一個基本方案可能看起來像this blog post,雖然博客文章是關於四捨五入的浮動到 浮動代表最接近的整數。

1

在IEEE 754算法標準化之前,有許多競爭廠商特定的浮點運算方法。這些具有不同的範圍,精度,並且相對於溢,下溢,符號零不同的行爲,以及未定義的結果如0/0或SQRT(-1)。

但是,您可以將浮點實現劃分爲兩個基本組:硬件和軟件。在硬件中,您通常會看到執行轉換的操作碼,儘管協處理器FPU會使事情變得複雜。在軟件中,轉換將通過函數完成。

今天,仍然有軟FPU,主要是在嵌入式系統上。不久之前,這在移動設備中很常見,但在較小的系統上,軟FPU仍然是常態。

1

這取決於編譯器的實現。您可以用任何語言(C:http://www.jhauser.us/arithmetic/SoftFloat.html中的示例)實現浮點運算,因此通常編譯器的運行時庫將包含浮點運算等軟件實現(或者目標硬件可能一直支持本地指令這又取決於硬件),並且針對FPU或使用SSE的指令作爲優化提供。

0

是。通過移動尾數將指數變爲0,將數字非規格化。如果結果對於int太大,則生成異常。否則,非規格化的數字(減去派系部分和可選的四捨五入)就是等效的整數。

1

事實上,浮點操作對於硬件工程師來說是一個挑戰,因爲它們需要很多硬件(導致最終產品的成本更高)並消耗很多功率。有一些架構不包含浮點單元。還有一些體系結構甚至不提供指令,即使是整數除法等基本操作。 ARM架構就是一個例子,你必須在軟件中實現分工。此外,浮點單元在此體系結構中作爲可選協處理器。考慮到ARM是嵌入式系統中使用的主要體系結構,這一點值得思考。

IEEE 754(今天在大多數應用中使用的浮點標準)不是表示實數的唯一方式。您也可以使用固定點格式來表示它們。例如,如果你有一臺32位機器,你可以假設你有一個位15和16之間的小數點,並執行操作記住這一點。這是一種表示浮點數的簡單方法,可以用軟件輕鬆處理。

1

在浮點單位之前並不適用,因爲一些最早的計算機在1940年代支持浮點數:wiki - first electro mechanical computers

在沒有浮點硬件的處理器上,浮點運算是用軟件或某些計算機上的微碼實現的,而不是全部實現硬件:wiki - microcode,或者操作可以由單獨的硬件組件處理,例如英特爾x87系列:wiki - x87

1

但我的問題是:浮點轉換是否總是這樣處理?

沒有,有就比86所以沒有cvttss2si要麼

一切都可以用軟件做的,你也可以做硬件,反之亦然其他架構沒有的x87或SSE。

相同的浮動轉換。如果你沒有硬件支持,只需做一些黑客攻擊。這裏沒有什麼低級別的東西,所以你可以輕鬆地用C語言或任何其他語言來完成。目前已經在SO