双精度,单精度和半精度

浮点数是计算机上最常用的数据类型之一,有些语言甚至数值只有浮点型(Perl,Lua同学别跑,说的就是你)。

常用的浮点数有双精度和单精度。除此之外,还有一种叫半精度的东东。

双精度64位,单精度32位,半精度自然是16位了。

半精度是英伟达在2002年搞出来的,双精度和单精度是为了计算,而半精度更多是为了降低数据传输和存储成本。

很多场景对于精度要求也没那么高,例如分布式深度学习里面,如果用半精度的话,比起单精度来可以节省一半传输成本。考虑到深度学习的模型可能会有几亿个参数,使用半精度传输还是非常有价值的。

Google的TensorFlow就是使用了16位的浮点数,不过他们用的不是英伟达提出的那个标准,而是直接把32位的浮点数小数部分截了。据说是为了less computation expensive。。。

比较下几种浮点数的layout:

双精度浮点数placeholder

单精度浮点数placeholder

半精度浮点数placeholder

它们都分成3部分,符号位,指数和尾数。不同精度只不过是指数位和尾数位的长度不一样。

解析一个浮点数就5条规则

  1. 如果指数位全零,尾数位是全零,那就表示0
  2. 如果指数位全零,尾数位是非零,就表示一个很小的数(subnormal),计算方式 (−1)^signbit × 2^−126 × 0.fractionbits
  3. 如果指数位全是1,尾数位是全零,表示正负无穷
  4. 如果指数位全是1,尾数位是非零,表示不是一个数NAN
  5. 剩下的计算方式为 (−1)^signbit × 2^(exponentbits−127) × 1.fractionbits

常用的语言几乎都不提供半精度的浮点数,这时候需要我们自己转化。

具体可以参考Numpy里面的代码:

https://github.com/numpy/numpy/blob/master/numpy/core/src/npymath/halffloat.c#L466

当然按照TensorFlow那么玩的话就很简单了(~摊手~)。

参考资料:

https://en.wikipedia.org/wiki/Half-precision_floating-point_format

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

https://en.wikipedia.org/wiki/Single-precision_floating-point_format

http://download.tensorflow.org/paper/whitepaper2015.pdf

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值