<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 高效的C編程之: 浮點(diǎn)運(yùn)算

          高效的C編程之: 浮點(diǎn)運(yùn)算

          作者: 時(shí)間:2013-09-30 來源:網(wǎng)絡(luò) 收藏

          14.10

          大多數(shù)的處理器硬件上并不支持。但上提供了以下幾個(gè)選項(xiàng)來實(shí)現(xiàn)

          本文引用地址:http://www.ex-cimer.com/article/257015.htm

          ·(Floating-PointAccelerator):上提供了一組協(xié)處理器指令專門實(shí)現(xiàn)浮點(diǎn)運(yùn)算。但這需要硬件支持,具體某一處理器上是否有協(xié)處理器支持,可以查看ARM相關(guān)手冊(cè)。

          ·浮點(diǎn)運(yùn)算仿真(FPE):使用軟件仿真了協(xié)處理器的執(zhí)行。

          ·浮點(diǎn)運(yùn)算庫(FPLib):使用ARM的浮點(diǎn)運(yùn)算庫函數(shù)實(shí)現(xiàn)程序中的浮點(diǎn)運(yùn)算操作。這就意味著C編譯器要把每一個(gè)浮點(diǎn)操作轉(zhuǎn)換成一個(gè)子程序調(diào)用。C庫中的子函數(shù)使用整型運(yùn)算來模擬浮點(diǎn)操作。這些代碼是用高效的匯編語言編寫而成的。盡管如此,浮點(diǎn)運(yùn)算執(zhí)行起來還是要比相應(yīng)整型運(yùn)算慢得多。

          注意

          Thumb指令不支持協(xié)處理器指令,所以在Thumb狀態(tài)下實(shí)現(xiàn)浮點(diǎn)運(yùn)算,只能調(diào)用ARM浮點(diǎn)運(yùn)算庫。

          為了在ARM上高效地實(shí)現(xiàn)浮點(diǎn)運(yùn)算,請(qǐng)遵循以下規(guī)則。

          ·避免使用浮點(diǎn)除法運(yùn)算。通常情況下,除法運(yùn)算的執(zhí)行速度是普通加法或乘法運(yùn)算速度的1/2。在無法避免除法的情況下,盡量使除法的除數(shù)為常數(shù)。如,x=x/3.0,可將其變?yōu)閤=x*(1.0/3.0)。這樣除數(shù)為常數(shù)(1.0/3.0),該值在編譯階段由編譯器計(jì)算。

          ·使用float型代替double型。float型要比double使用更少的內(nèi)存和寄存器。

          ·避免使用三角函數(shù)功能。實(shí)現(xiàn)三角函數(shù)功能,如sin、cos,使用了大量的乘加運(yùn)算,它的運(yùn)算速度大約是普通乘法運(yùn)算的十倍。

          ·當(dāng)編譯器處理浮點(diǎn)運(yùn)算操作時(shí),由于精度的影響很多優(yōu)化不能實(shí)現(xiàn)。比如,表達(dá)式3*(x/3),編譯器不能判斷其值和x是等價(jià)的。所以在使用浮點(diǎn)運(yùn)算表達(dá)式時(shí),最好先人工的做一些必要的優(yōu)化。



          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();