加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 电子发烧 > 单片机学习

关于ARM芯片浮点运算的资料

时间:2013-09-08  来源:123485.com  作者:9stone
微软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 位元。
分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->单片机学习
  • 电子应用基础
  • 电源技术
  • 无线传输技术
  • 信号处理
  • PCB设计
  • EDA技术
  • 单片机学习
  • 电子工具设备
  • 技术文章
  • 精彩拆解欣赏
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门