公式引入

存储方式:1位符号位+5位指数位+10位尾数位,共16位,内存占2个字节
sign:符号位
exponent:指数位(阶码)
fraction:小数位(尾数)

fp16表示为:

1.(1.0+fraction)中的1

规格化数(normal number):小数点前只有1位数,且非0
例:1.0 * 2^0, 0.1 * 2^1, 0.01 * 2^2都表示1,其中1.0 * 2^0被称为规格化值,后两者为非规格化值。

对于二进制数,只存在0和1,所以规格化值小数点前的一位一定是1,则可以不用特地拿出1bit数去表示,在需要计算数值时,将这个1加上就行,这样在表示规格化值时,可以省出1Bit,使能表示的范围更大。所以小数部分中的前导1没有存储在内存中,但有效数字实际上是11位。

上述即为fp16的规格化数表达式

2. 2^(exponent-15)中的15

假设如果直接用2^exponent表示,其中5位的exponent用补码表示,则数字1/2和2的表示为:
1/2 : 0 11111 0000000000 (1/2 = 1.0 * 2^(-1), -1的补码为11111)
2:0 00001 0000000000 (2 = 1.0 * 2^1, 1的补码为00001)
在硬件实现浮点数比较运算时,如果复用整数的比较运算电路,这时就会得出1/2比2大的结果。


IEEE754标准使biased-exponent(基于偏移的阶码域)解决了这一问题,biased表示它采用偏移的编码方式。也就是5位的exponent没有符号位,而是通过设置一个中间值作为0,小于该中间值则为负数,大于改中间值则为正数。IEEE 754中规定bias = 2^(e-1) - 1,e为biased-exponent所占位数,所以fp16表示中,bias = 2^(5-1) - 1 = 15,小于15为负,大于15为正;

相比最初的补码形式,引入指数偏移之后,实际表示的数据和原二进制一样开始按照升序表示。
1/2和2的IEEEE754表示为:
1/2 : 0 01110 0000000000 (1/2 = 1.0 * 2^(-1), -1=14 - bias)
2:0 10000 0000000000 (2 = 1.0 * 2^1, 1 = 16 - bias)
这时可以不对浮点做特殊处理,直接将16bit视作整数来比较大小。这就是为什么fp16的指数部分是2^(exponent-15)的原因。

3.fp16的规格化值

对于规格化值,exponent的取值范围为0 0001~ 1 1110,也就是1~30,Exponent = exponent-bias取值范围为-14 ~ 15,(0 0000和1 1111作为预留值来定义NaN,+/-Inf,+/-0,详细见后文)
fraction的取值范围为00 0000 0000 ~ 11 1111 1111,1+fraction取值范围为1 ~ 1.11 1111 1111

所以:
fp16规格化数能表示的趋于0的最小数为0 00001 0000 0000 00=1.0 * 2^(-14), 约等于6.1 * 10^(-5)
fp16规格化数能表示的最大值为:0 11110 1111 1111 11=1.11 1111 1111 * 2 ^ 15 = (2 - 2^(-10)) * 2 ^15=65536-32=65504
fp16规格化值的取值范围为:[-65504,-1.0 * 2^(-14) ]及[1.0 * 2^(-14), 65504]

4. fp16的非规格化数值


由上面表达式可以知道,规格化数值能表示的最小的趋近于0 的数为1.0 * 2^(-14),也就是0~1.0 * 2^(-14)之间的数无法表示。IEEE754标准规定:当exponent取0 0000时的非0值,用denormalized number(非规格化数)表示,非规格数的作用就是用于表示非常趋近于0的数。当想表示的数值比 2 ^(-14)还要小时,这个数就会以非规格化表示,原本的M = 1+fraction,会变为M = fraction ,如下图。

非规格化数可以表示的最大数为:0.11 1111 1111*2^(-14) = (1- 2 ^(-10))*2 ^(-14)=2 ^(-14) - 2 ^(-24)
非规格化数可以表示的最小的趋近于0的数为:0.00 0000 0001 * 2 ^(-14) =2 ^(-24)
非规格化数的取值范围:[-(2 ^(-14) - 2 ^(-24)), -2 ^(-24]及[2 ^(-24), 2 ^(-14) - 2 ^(-24)]

可能在想这里的指数为什么是1-bias而不是0-bias。在非规格化数值表示时,exponent明明是可以取到0的,这是为了提供数值从非规格化值到规格化值的平滑过度。这样就能和规格化数的取值范围[-65504,-1.0 * 2^(-14) ]及[1.0 * 2^(-14), 65504]合并为新的取值范围:
[-65504, -2 ^(-24)]及[2 ^(-24), 65504]

5. fp16的特殊值

  • IEEE754标准规定当exponent和fraction都为0时,fp16值为0
    此处和规格化值和非规格化值得取值范围[-65504, -2 ^(-24)]及[2 ^(-24), 65504]就能合并为fp16的完整范围:[-65505,65504]。


    所以在0除以某个数时会区分正负,其余情况对做+/-0不做区分.
    +0:0 00000 0000000000
    -0:1 00000 0000000000

  • 当exponent全为1时,表示非正常数(non-number):NAN和正负Inf
    NAN(比如a/0 、-1开根号、Inf-Inf、Inf*0):符号位任意,指数位全1,尾数位非全0
    Inf:符号位为0,指数位全1,位数位全0
    -Inf:符号位为1,指数位全1,尾数位全0

【补充】

  1. 当讨论fp16的取值范围时,实际讨论的是规格化数的范围,通过fp16的表达公式可知,增加fraction可以提高表示的精度,增加exponent可以提高表示的范围。计算机中存储位数是有限的,所以需要在表示范围和精度之间权衡,如果fraction过大,此时获得了较高的精度,但是可以表示的数值范围就有限。

  2. fp16的精度2^(-10)可以转换成对应十进制数的小数点后几位,计算如下:

    所以fp16可以精确到小数点后3位

6. fp16运算

  • 加、减:参考机器学习-fp16相加
  • 乘:参考机器学习-fp16相乘
  • 平方根
  • 求余
  • 比较

7. fp16转换

  • fp16转整形
  • 整形转fp16:参考机器学习-fp16转int8
  • fp16转成十进制数

机器学习-fp16表示相关推荐

  1. 6个步骤,告诉你如何用树莓派和机器学习DIY一个车牌识别器!(附详细分析)...

    作者 | Robert Lucian Chiriac 翻译 | 天道酬勤,编辑 | Carol 出品 | AI科技大本营(ID:rgznai100) 几个月前,作者开始考虑让汽车能够具备检测和识别物体 ...

  2. 因买不到 RTX 3090,他花 19 万搭了一个专业级机器学习工作站

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | Emil Wallner 编译 | 青暮.陈大鑫 转自 | ...

  3. 因买不到RTX 3090,小哥自己搭建了一个专业级机器学习工作站

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自|知乎   作者|Emil Wallner 来源 AI科技评论 编辑丨极市平台 极 ...

  4. 机器学习与差分隐私(认证鲁棒性和隐私保护)

    Trustworthy Machine Learning with Differential Privacy and Certified Robustness 写在前面的话 研究现状 作者的思考 DP ...

  5. cube一站式云原生机器学习平台-推理服务的工程化加速

    全栈工程师开发手册 (作者:栾鹏) 一站式云原生机器学习平台 前言:cube是tme开源的云原生机器学习平台,目前包含特征平台,支持在/离线特征:数据源管理,支持结构数据和媒体标注数据管理:在线开发, ...

  6. 28款GitHub最流行的开源机器学习项目,推荐GitHub上10 个开源深度学习框架

    20 个顶尖的 Python 机器学习开源项目 机器学习 2015-06-08 22:44:30 发布 您的评价: 0.0 收藏 1收藏 我们在Github上的贡献者和提交者之中检查了用Python语 ...

  7. 28个Github上最火的机器学习开源项目

    1. TensorFlow TensorFlow 是谷歌发布的第二代机器学习系统.据谷歌宣称,在部分基准测试中,TensorFlow的处理速度比第一代的DistBelief加快了2倍之多. 具体的讲, ...

  8. Nvidia GPU的浮点计算能力(FP64/FP32/FP16)

    转自:http://weibo.com/ttarticle/p/show?id=2309403987017473113077 ​​其实说到浮点计算能力,首先得区分不同精度的浮点数,虽然Linpack测 ...

  9. MIT2020年力作:机器学习加速器综述

    [前言] 首先还是保命时刻,以下解读与见解均为我的个人理解,要是我有哪里曲解了,造成了不必要的麻烦,可以联系我删除文章,也可以在评论区留言,我进行修改.也欢迎大家在评论区进行交流,要是有什么有意思的p ...

最新文章

  1. java代码_Java:java五行代码实现Excel的快速导出
  2. centos7 python3安装numpy_Centos7安装python3、numpy、scipy、matplotlib、pandas等
  3. 使用android ProgressBar和Toast生成一个界面
  4. Node.js webpack中导入vue的三种方法
  5. Paas是什么——Go语言相关学习笔记
  6. java二分法查找法算法_算法二:二分法查找(java语言)
  7. 转为yaml python_python 如何使用HttpRunner做接口自动化测试
  8. nowcoderG 小国的复仇
  9. (转载)oracle10g在win10上的安装
  10. 缺什么知识就补什么知识
  11. 【转】用万兆网卡测试超五类网线传输速度,颠覆你的认知
  12. Stream.of()用法示例
  13. Android 猜歌曲游戏开发
  14. 【侯捷 C++ 面向对象高级开发】课程笔记以及个人注释(附带课程资源)
  15. Postgresql skip locked跳过行锁消除行锁冲突等待
  16. 网络直播电视之寻找直播地址(下)
  17. 2021-2027全球与中国翠绿宝石激光器市场现状及未来发展趋势
  18. Python地学分析 — 地理空间参考系介绍
  19. 工具推荐:浏览器插件 快速阅读 一目十行
  20. win7计算机右键属性无法打开,win7计算机右键属性打不开怎么办

热门文章

  1. Code VBA完整代码块,创建Visual Basic源代码
  2. Spring基础之IOCAOPDI
  3. Java 8-Duration 详解
  4. 苹果进军RISC-V 招聘职位已发布
  5. 教你查询快递单号物流,并筛选已签收还有的物流单号
  6. 2022育婴员(五级)判断题及答案
  7. HDU 1236 排名(Microsoft_zzt)
  8. 为更美好的商业生态,全力以赴
  9. 攻防世界 简单的base编码
  10. 基于51单片机的智能晾衣架