如何在沒有浮點單元的處理器上執行浮點數學運算?例如低端8位微控制器。不支持它的處理器上的浮點數學?
回答
看一看這篇文章: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也是一個啓示。
泰勒級數近似函數近點。一個**最常見**要求在一個區間內進行一致的精確逼近,這使泰勒級數成爲使用的錯誤工具。 http://lolengine.net/blog/2011/12/21/better-function-approximations –
@PascalCuoq - 很好的補充。我同意這取決於要求是什麼。這並不是說我是泰勒系列的粉絲,對我來說,使用一系列功能來近似一個功能讓人大開眼界。 –
在沒有任何浮點硬件的系統中,CPU使用在整數算術邏輯單元上運行的一系列更簡單的定點算術運算來模擬它。
查看wikipedia頁面:Floating-point_unit#Floating-point_library,您可能會發現更多信息。
它實際上並不是模擬指令的CPU。低端CPU的浮點操作是由整數算術指令構成的,編譯器就是生成這些指令的那個。基本上編譯器(工具鏈)帶有一個包含浮點函數的浮點庫。
請參閱http://www.worldofspectrum.org/documentation.html上的「完整的頻譜ROM反彙編」以查看8位Z80處理器上的浮點計算示例。
對於像正弦函數這樣的事情,您需要預先計算一些值然後使用Chebyshev polynomials進行插值。
簡短的回答是「緩慢」。專門的硬件可以完成一些任務,比如提取不需要非常快的字節對齊的比特組。軟件可以完成所有可以通過專用硬件完成的任務,但往往需要更長的時間才能完成。
- 1. 沒有C預處理器處理浮點數學常數
- 2. Sympy不處理浮點數
- 3. '\'運算符不支持浮點數?
- 4. 不支持CAS操作的處理器上的compareAndSet
- 5. Android - Skobbler不支持64位處理器
- 6. 浮點後處理數字
- 7. 如何處理浮點數
- 8. 支持模式1.1的XML處理器
- 9. 確定處理器對SSE2的支持?
- 10. 支持`xz`的多處理器?
- 11. Android NDK:libC++支持硬浮點數
- 12. 定點處理器中浮點操作的數據結構
- 13. 不支持的視頻格式處理
- 14. 遷移處理不支持的類型
- 15. 支持硬件浮點支持的GNU ARM工具鏈
- 16. 數學計算 - 浮點數
- 17. 不同系統上的浮點和數學精度
- 18. 支持多個文件上傳處理
- 19. 爲什麼我的libmpg123構建不支持浮點?我如何啓用它?
- 20. MIPS處理器I/O設備支持
- 21. GCC處理在不同的優化級別上浮點數比較不同
- 22. Npgsql的:不支持時間戳舊的浮點表示
- 23. Android浮點數學性能
- 24. Java浮點數學錯誤?
- 25. 支持循環付款的WHMCS支付處理器?
- 26. Php不支持數學字符
- 27. gcc 4.x不支持x87 FPU數學?
- 28. 它支持在節點
- 29. 在Bash中處理浮點數
- 30. Logging dictConfig不支持多處理
看看[avr-libc](http://www.nongnu.org/avr-libc/) - 它使用整數數學來實現數學函數,並依賴編譯器支持來處理浮點值。連接數學支持功能可能非常昂貴。 –
相關:http://stackoverflow.com/questions/9060852/how-floats-are-computed-on-a-machine-without-an-fpu – Jeff