2013-10-01 36 views
3

如何在沒有浮點單元的處理器上執行浮點數學運算?例如低端8位微控制器。不支持它的處理器上的浮點數學?

+1

看看[avr-libc](http://www.nongnu.org/avr-libc/) - 它使用整數數學來實現數學函數,並依賴編譯器支持來處理浮點值。連接數學支​​持功能可能非常昂貴。 –

+0

相關:http://stackoverflow.com/questions/9060852/how-floats-are-computed-on-a-machine-without-an-fpu – Jeff

回答

4

看一看這篇文章:http://www.edwardrosten.com/code/fp_template.html

(從這篇文章)

首先,你必須考慮如何在內存中表示浮點數:

struct this_is_a_floating_point_number 
{ 
    static const unsigned int mant = ???; 
    static const int   expo = ???; 
    static const bool   posi = ???; 
}; 

然後你我們必須考慮如何使用這種表示來進行基本的計算。有些可能很容易實現,並且在運行時相當快(乘以或除以2時會想到)

可能比較困難,例如可以使用牛頓算法計算答案。

最後,智能近似值和表中生成的值可能會加快運行時的計算速度。

很多年前C++模板幫助我獲得浮點運算的Intel 386 SX

最後,我學到了很多數學和C++,但同時決定買一個協處理器。

特別是多項式算法和智能查找表;當你有正弦函數時需要餘弦函數或tan函數,這對於使用整數來進行浮點運算有很大的幫助。 Taylor series也是一個啓示。

+1

泰勒級數近似函數近點。一個**最常見**要求在一個區間內進行一致的精確逼近,這使泰勒級數成爲使用的錯誤工具。 http://lolengine.net/blog/2011/12/21/better-function-approximations –

+1

@PascalCuoq - 很好的補充。我同意這取決於要求是什麼。這並不是說我是泰勒系列的粉絲,對我來說,使用一系列功能來近似一個功能讓人大開眼界。 –

3

在沒有任何浮點硬件的系統中,CPU使用在整數算術邏輯單元上運行的一系列更簡單的定點算術運算來模擬它。

查看wikipedia頁面:Floating-point_unit#Floating-point_library,您可能會發現更多信息。

它實際上並不是模擬指令的CPU。低端CPU的浮點操作是由整數算術指令構成的,編譯器就是生成這些指令的那個。基本上編譯器(工具鏈)帶有一個包含浮點函數的浮點庫。

2

簡短的回答是「緩慢」。專門的硬件可以完成一些任務,比如提取不需要非常快的字節對齊的比特組。軟件可以完成所有可以通過專用硬件完成的任務,但往往需要更長的時間才能完成。