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

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

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

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

与FP32(1,8,23)比较,bf16的表示范围没有变化,只是最小粒度发生变化,fp32最小数值粒度,bf16最小数值粒度.同时节约内存资源,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 roundtoodd

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

浮点数二进制乘法

乘法选择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.

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

则移位相当于

如下

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

经验分享 程序员 微信小程序 职场和发展