浮点数的二进制计算-乘法及移位运算

python code仿真嵌入式内核(AI芯片,GPU等)的计算行为,浮点数运算对于底层运算的来说为二进制运算。

  • 浮点数二进制存储形式(bfloat16)
  • 浮点数十进制到二进制转换
  • 舍入原则
  • 二进制乘法
  • 移位运算

bfloat16二进制表示:1bit符号位,0为正,1为负;8bit的指数位;7bit的尾数

与FP32(1,8,23)比较,bf16的表示范围没有变化,只是最小粒度发生变化,fp32最小数值粒度1/2^{23},bf16最小数值粒度1/2^{7}.同时节约内存资源,FP32占4B,bf16占2B。

 浮点数十进制转化成二进制

3.75  -> 11.11 -> 1.111 x 2^1 -> 指数部分位127+1 = 128  -> 0 10000000 1100000

浮点数一般舍入原则

floor向下取整
ceil向上取整
roundtozero

向靠近0的方向取整

roundtoceil向远离0的方向取整
roundtoeven

frac = x - \left \lfloor x \right \rfloor

frac < 0.5, y = \left \lfloor x \right \rfloor, frac > 0.5, y = \left \lceil x \right \rceil

frac == 0.5, \left \lfloor x \right \rfloor/2 \epsilon \mathbb{Z}, y=\left \lfloor x \right \rfloor

frac == 0.5,\left \lfloor x \right \rfloor/2 \notin \mathbb{Z},y = \left \lceil x \right \rceil

roundtoodd

frac = x - \left \lfloor x \right \rfloor

frac < 0.5, y = \left \lfloor x \right \rfloor, frac > 0.5, y = \left \lceil x \right \rceil

frac == 0.5, \left \lfloor x \right \rfloor/2 \epsilon \mathbb{Z}, y=\left \lceil x \right \rceil

frac == 0.5,\left \lfloor x \right \rfloor/2 \notin \mathbb{Z},y = \left \lfloor x \right \rfloor

表中只列出了部分舍入原则,不同的浮点处理单元所支持的浮点的舍入原则也不尽相同,要根据实际的硬件平台确定舍入原则。

浮点数二进制乘法

乘法选择roundtoeven原则

3.9375*3.9375 (数据类型为bfloat16)

11.1111 -> 1.11111 x 2^1   *  11.1111 -> 1.11111 x 2^1   -> 1.11111 x 1.11111 x 2^2

那么二进制的乘法结果为11.1110000001 x 2^2  ->  1.11110000001x 2^3 -> 1.1111000(roundtoeven)x2^3 

将结果转化为IEEE754的表示形式:

符号位:0

指数位:127+3 = 130 -> 10000010

位数位:1111000

乘法的结果为,0 10000010 1111000

移位运算

移位运算指的是向右或向左进行移位,本节描述的移位并不像整数类型直接是位置向左或向右shift,这里你可以理解为一个浮点数除以或是乘以2^n.

浮点数也可通过如下表示,

x = sign(x) \cdot mantissa(x) \cdot 2^{exponent(x))}

则移位相当于

x = sign(x) \cdot mantissa(x) \cdot 2^{exponent(x)-n}

如下

3.9375*3.9375/2^n

3.9375*3.9375结果的指数部分为10000010

3.9375*3.9375/2^n结果指数部分为10000010 - n, sign与mantissa位不变。

若n=2,则3.9375*3.9375/2^n 的结果为,0 10000000 1111000

如有异议,可随时给我留言,大家一起讨论。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值