您的位置:首页 > 其它

微软MSDN上关于ARM芯片浮点运算的资料 Zz

2006-11-23 10:34 330 查看
 发信人: RayXP (°﹏ °ㄨ), 信区: Embedded
标  题: 微软MSDN上关于ARM芯片浮点运算的资料 Zz
发信站: 郁金香BBS站 (2006年10月24日20:30:55 星期二), 站内信件

思想和Q格式运算一样
____________________________________

微软MSDN上关于ARM芯片浮点运算的资料
勿使用浮點運算
ARM 處理器並不支援浮點運算 (Floating Point Math)。所有的浮點運算都是在浮點運
算模擬器上進行,因此特別緩慢。需要浮點運算的函式,常要耗費數千個循環才能執行
完畢。這就是為何遊戲開發時,通常都使用定點 (Fixed Point) 格式的運算。定點運算
實際上是使用整數,但指定固定數目的位元做為數值的分數部份。就好像是指定某一數
字,其千位數以下為分數。若要表示 0.500,只要乘以 1000,便得到 500 這個數值。
比較困難的部份,是開發人員必須隨時想像這個隱形的小數點。加法與減法比較沒有問
題:500 + 500 = 1000 (可視為:0.500 + 0.500 = 1.000)。乘法與除法則較為困難:
500 * 500 = 250000 (但若視為:0.500 * 0.500 = 250.000) 結果會不正確。兩個定點
數值相乘後,必須以除法調整有效位數。若將結果除以 1000,則得到正確值 (250.000
 / 1000 = 0.250 為正確的結果)。因此,進行乘法運算時,先做一般的乘法運算,再以
除法調整結果的有效位數。
上述方法會引出一項有趣的問題。相乘後但尚未調整位數前,此居中數值的範圍為何?
在上例中,執行乘法後,數值可能會超過允許的位元數。亦即,可能會造成溢位,而得
不到您想要的結果。解決方法是為居中數值指定合適的資料格式,確保能儲存可能的最
大值。當您將兩個 32 位元數值相乘時,居中數值必須是 64 位元。調整位數後 (以及
截斷數值),結果會恢復為 32 位元。
   int Multiply16_16_by_16_16( int a16_16, int b16_16 )
{
     __int64 tmp32_32;
     int result16_16;
     tmp32_32 = a16_16;
     tmp32_32 *= b16_16;     // 目前結果為 32:32
     tmp32_32 >>= 16; // 截斷 16 個低位元
     result16_16 = ( int ) tmp32_32; // 截斷 16 個高位元
     // 目前結果回到 16:16
     return result16_16;
}
若要除法運算,則執行相反的程序:先以乘法調整,再進行相除。
常用的定點格式為 16:16,亦即前 16 位元代表整數部份,後 16 位元代表分數部份。
以此遊戲專案而言,使用了各種不同的格式,以便應用在遊戲引擎中各種範圍的數值。
簡而言之,共使用了 2:30、8:24、16:16、24:8、28:4、2:14、8:8、11:5、2:8 以及
4:4。其中大多數是 32 位元數值,但有些是 16 位元、10 位元或 8 位元。

--
          _____  __  __ _      _
    //   |  __ /|  //  | |    (_)
   /  /  | |__) | /  / | |     _ _ __  _   ___  __
  / // / |  _  /| |//| | |    | | '_ /| | | / // /
 / ____ /| | / /| |  | | |____| | | | | |_| |>  <
/_/    /_/_|  /_/_|  |_|______|_|_| |_|/__,_/_//_/
※ 来源:·郁金香BBS站 bbs.stu.edu.cn·[FROM: 郁金香BBS站]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: