14.10 浮點運算
大多數(shù)的ARM處理器硬件上并不支持浮點運算。但ARM上提供了以下幾個選項來實現(xiàn)浮點運算。
· 浮點累加協(xié)處理器FPA(Floating-Point Accelerator):ARM上提供了一組協(xié)處理器指令專門實現(xiàn)浮點運算。但這需要硬件支持,具體某一處理器上是否有FPA協(xié)處理器支持,可以查看ARM相關手冊。
· 浮點運算仿真(FPE):使用軟件仿真了FPA協(xié)處理器的執(zhí)行。
· 浮點運算庫(FPLib):使用ARM的浮點運算庫函數(shù)實現(xiàn)程序中的浮點運算操作。這就意味著C編譯器要把每一個浮點操作轉(zhuǎn)換成一個子程序調(diào)用。C庫中的子函數(shù)使用整型運算來模擬浮點操作。這些代碼是用高效的匯編語言編寫而成的。盡管如此,浮點運算執(zhí)行起來還是要比相應整型運算慢得多。
注意 |
Thumb指令不支持協(xié)處理器指令,所以在Thumb狀態(tài)下實現(xiàn)浮點運算,只能調(diào)用ARM浮點運算庫。 |
為了在ARM上高效地實現(xiàn)浮點運算,請遵循以下規(guī)則。
· 避免使用浮點除法運算。通常情況下,除法運算的執(zhí)行速度是普通加法或乘法運算速度的1/2。在無法避免除法的情況下,盡量使除法的除數(shù)為常數(shù)。如,x=x/3.0,可將其變?yōu)閤 = x * (1.0/3.0)。這樣除數(shù)為常數(shù)(1.0/3.0),該值在編譯階段由編譯器計算。
· 使用float型代替double型。float型要比double使用更少的內(nèi)存和寄存器。
· 避免使用三角函數(shù)功能。實現(xiàn)三角函數(shù)功能,如sin、cos,使用了大量的乘加運算,它的運算速度大約是普通乘法運算的十倍。
· 當編譯器處理浮點運算操作時,由于精度的影響很多優(yōu)化不能實現(xiàn)。比如,表達式3 * (x / 3),編譯器不能判斷其值和x是等價的。所以在使用浮點運算表達式時,最好先人工的做一些必要的優(yōu)化。