浮点转定点(以float32转int8)为例

一, 转化流程

要将浮点数转换为定点数,需要执行以下步骤:

  1. 选择定点数表示方式: 定点数通常表示为整数和小数部分的组合,决定小数部分的位数。例如,16位定点数可以有8位整数部分和8位小数部分。
  2. 确定定点数的分辨率: 分辨率是指小数部分可以表示的最小单位。例如,如果使用8位小数部分,则分辨率是1/256=0.00390625。
  3. 计算缩放因子: 缩放因子用于将浮点数转换为定点数表示的整数。缩放因子是小数部分的最大值。例如,若小数部分有8位,缩放因子为2^8=256 。
  4. 缩放浮点数: 将浮点数乘以缩放因子。例如,若浮点数为 ,缩放因子为256,则计算结果为 1.5*256=384。
  5. 转换为整数: 将缩放后的值舍入或截取为整数。例如,384可以直接表示为整数。
  6. 定点表示: 如果定点数使用带符号表示,例如16位中的1位为符号位,7位为整数位,8位为小数位,则转换后的数字384需要转换为二进制形式并适当加入符号位。

二,示例

假设我们将浮点数7.6转换为定点数,定点数定义为8位(1位符号位,4位整数位,3位小数位):
浮点数: 1
分辨率: 1/16
缩放因子: 16
缩放浮点数: 7.6*16=122
转换为整数: 122
转换为二进制(假设带符号): 122的二进制表示为01111010。
最终结果是将浮点数7.6表示为定点数122(011111010),通过上面步骤实现浮点数到定点数的转换。

三,验证

符号位 : 0(正数)。
整数部分: 111(二进制)表示为 7(十进制),占用 3 位。
小数部分: 1010(二进制)表示为 0.625(十进制),占用 4 位。
最终定点数表示如下:
在这里插入图片描述
为了确定转换的正确性,将定点数01111010转回浮点数:
结果为 7.625,可以认为是进行舍入后的近似值,因此验证通过。

四,原理和理解

本质上是将将非离散值量化到离散值空间,所以浮点转定点也叫浮点量化,是一种神经网络优化方法,一来减少内存需求,而来提高读取和处理的效率。

在这里插入图片描述

五,浮点相乘转换为定点相乘

假设两个浮点数为 3.4 和 2.75

1. 步骤 1:定义定点数格式
采用8位定点数表示,格式如下:
1位符号位
3位整数位
4位小数位

2. 步骤 2:量化浮点数
首先,我们需要将浮点数量化为定点数。由于小数部分有4位,所以缩放因子S为16。
量化 3.4:
3.4×16=54.4;
舍入:54 (转化为整数)
54 D = 00110110 b
理解:
如果存在一个8位定点数A能无损表示3.4,那么A×16为整数且A×16===3.4,但是因为不存在,所以将54.4舍入为54(四舍五入)只是为了找到一个最近的8位定点数

量化 2.75:
2.75×16=44
无需舍入:44 (转化为整数)
44 D = 00101100 b

3. 步骤 3:用定点数相乘
量化后的两个数值为54和44。定点数相乘时,原始乘积应包含更多的位数以避免溢出。所以保持乘积并在之后进行适当缩放。
54×44=2376

4. 步骤 4:适当缩放积
由于我们使用了16(2^4)进行缩放,结果则有16 * 16 = 256 的缩放因子。因此需要将结果缩小至原来的数量级。

2376/256=9.28125

验证
实际的浮点数乘积计算:
3.4*2.75=9.35

对比与分析
量化后乘积9.28125和实际乘积 9.35之间存在一定的误差,这是由于用定点数表示及其舍入造成的。然而,通过量化再进行相乘,可以节省计算资源,并在定点数表示中保持尽可能的精度。

六,感悟

浮点数量化,实质上就是对不便于硬件计算的浮点数,通过缩放的方式,转换成便于计算的定点数。

类比

当我们计算

> 0.002 * 2000

时,对于幼儿园来讲,这个计算可能有些复杂,但是我们对其进行转化变成

> 2*0.001*  2 *1000

时,就可以便于计算,其中0.001和1000就是缩放因子,当这个转换过程被套用到浮点转换成定点时(连续到离散)就被称为浮点数量化。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值