快速浮点数exp算法

现在的深度神经网络中,经常会使用到sigmoid函数或者softmax函数,而这些函数中都使用了浮点数的幂指数函数(ex)。常规的数学函数库ex的精度高,但是速度慢,本文将介绍一种通过操作计算机中IEEE754标准浮点数的表示方法,在精度损失很小的条件下大幅提升计算性能的算法。

1. IEEE浮点数表示

1.1. 双精度浮点数表示

64位的双精度浮点数中符号为1位,阶码域为11位,尾数域为52位,指数偏移值是1023。因此规格化的64位浮点数x的真值是:

 


1.2. 单精度浮点数表示

32位的单精度浮点数中符号为1位,阶码域为8位,尾数域为23位,指数偏移值是127。因此规格化的32位浮点数x的真值是:

 

2. 快速浮点幂指数算法

由于双精度和单精度浮点数在表示方式上具有相同的结构(符号位、指数位和尾数位),所以实现双精度和单精度浮点快速算法时具有相同的原理;但由于双精度浮点数和单精度浮点数具有不同的位宽(64比特和32比特),所以在具体实现快速算法时,各参数的取值略有差异。

下图中高32位包含了SEM,因为单精度浮点数为32位,双精度浮点数为64位,所以在图中表示的时候将低32位用虚线表示,以此强调单精度浮点数不存在虚线所示的低32位。将高32位看成一个int类型的整数,那么offset表示高32位中有offset位是属于浮点数的尾数M

如果忽略双精度和单精度的差异,浮点数的标准格式表示如下所示。

单精度浮点数时bias127,双精度浮点数为1023假设S=0M=0,则浮点数的值Y=2X利用上图中整数和浮点数之间关系可知:如果要求2X次方,只需要将(X+bias)的值放在高32位的E所示的内存中即可。公式可以表示为:


可以e的指数次幂转换为2的指数次幂进行计算。

当(T/ln2)的商为整数的情况,将(T/ln2 +bias)写入到浮点数的指数E部分,不会造成任何精度的损失;当T不能整除ln2时,有小数位产生,此时(T/ln2+bias)向左移offset位之后T/ln2的小数部分将出现在高32位的尾数M部分。其所表达的浮点数的值为:,证明过程可以看论文,因此我们可以减去一个C来修正函数的值,即


3. 浮点幂指数算法实现

3.1. 双精度浮点数幂指数算法实现

因为双精度浮点数中的高32位中符号位有一位,指数位有11位,所以属于尾数M的有offset=32-1-11=20位。

 

union
{
struct{uint32_t i;uint32_t j;}n;
double d;
}v;
v.n.i=(1<<20)*(1.4426950409*val+1022.9420151853);
return v.d;


3.2. 单精度浮点幂指数算法实现

因为单精度浮点数中符号位1位,指数位8位,所以offset=32-1-8=23


union
{
uint32_t i;
float f;
}v;
v.i=(1<<23)*(1.4426950409*val+126.94201519f);
return v.f;

Schraudolph N N. A Fast, Compact Approximation of the Exponential Function[J]. Neural Computation, 1999, 11(4):853.

  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值