算法移植:浮点数定点化

参考网址:
编写高效代码(4) 在精度允许的条件下,将浮点数定点化
算法移植-浮点转定点运算(一)

一、为什么要定点化?

1、为了支持硬件处理:定点DSP

我这里有在VC下编写的用于数字信号处理的C程序,里面所用的数据格式全是double型的。现在要将程序移植到数据格式为16位的定点DSP(数字信号处理器)下运行,需要将浮点程序定点化。

定点运算相当于只会做整数的加减乘除,为了实现浮点运算,比如a=0.08,b=0.3 计算x=a+b时: 实际使用中不再出现a和b 而是(假设)用a =a×100; b =b×100替代,(这一步是人工计算的)x结果就是38。如果又用到x在其他表达式中,如y=x×30,y实际等于1140/100=11,因为他没有浮点数,小数忽略掉了,这就是定点造成的误差。如果y不做最后输出值使用,一直可以用1140代替,编程者需要清楚它是一个定标值。

2、浮点指令要比定点指令慢很多,功耗也大很多

在精度要求不那么高的情况下,就可以将浮点数定点化,用定点指令来代替浮点指令,一个典型的例子就是alpha混合。
《反恐精英》是很多人非常喜欢的游戏,在下面的游戏截图中,一个人扔了个烟雾弹,画面呈现出半透明的烟雾效果,随着时间的推移,烟雾逐渐散去,画面恢复到原来的状态。
这里写图片描述

这种效果如果让美工来实现,那会把人累死,其实这种效果在计算机中可以通过将两张图像进行半透明的混合来实现,这就是图像的alpha混合。混合后新图像每个像素的颜色值为:

 Pixel_ C = (int)(Pixel_A * alpha + Pixel_B * ( 1-alpha ));

alpha为透明度,是介于0和1之间的小数。随着时间的推移,烟雾图像的alpha值越来越小,当alpha为0时,烟雾效果就完全消失。
这条语句是一个浮点运算,由于图像上的每个像素都要经过这样的运算,相当耗时,其实可以将alpha定点化为0~32之间的一个整数值,0表示完全显示B图像,32表示完全显示A图像,中间分32个等级,这个代码可以改为:

 Pixel_ C = (Pixel_A * alpha + Pixel_B * ( 32-alpha ) + 16)>>5;

由于全部是定点语句,执行时间大幅减少。

二、浮点转定点运算

1、什么是定点数、浮点数?

首先我们要认清一个概念,定点数不一定是整数,浮点数不一定是小数。如其名,浮点数和定点数的区别就在于浮点和定点上,点就是指小数点。浮点数就是小数点是浮动的,定点数就是小数点是固定不动的。

2、什么是定点数?

浮点的小数位是可变的(随exponent变化),因此浮点数可表达的小数范围非常广。但浮点数运算量非常大(从它的定义上就知道了)。并且在目前市场占有量最大的定点DSP并不支持浮点运算。
因此,定点数应运而生。定点数就是指在一个数中,整数部分和小数部分位数固定。比如,我们定点数总共32位,其中小数占低13位:

typedef int fix_t;

#define FIX_FRACBITS 13

3、如何将一个int型的整数转化为定点数?

int类型转定点数最简单。上面的定义,小数位占低13位。

#define INTTOFIX(fix_t, fracbits, x) fix_t((x) << (fracbits))

即我们只需要将x左移就行了,当然要注意,如果x本身超过了整数部分的最大位数,则会产生溢出。

4、如何将一个double型小数转化为定点数?

浮点数转为定点数与int型转为定点数类似,比如说1.1101,转为有13位小数的定点数就是1 1 1010 0000 0000,也就是1.1101*2^13。
当然,在int型转定点时,我们使用了逻辑运算,而不是直接乘以2^13,是因为逻辑运算的速度一般比算术运算快几十倍。但是逻辑左移并不能运用于小数,double转定点时于是只能用算术乘法了。
下面是double转定点:

#define DBLTOFIX(fix_t, fracbits, x) \ fix_t(((x) * (double)((fix_t)(1) << (fracbits)))) )
  • 10
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值