最近在做工程时查阅“Deep Learning with Limited Numerical Precision”论文,偶然搜到一位博主的文章,借用了其编写的浮点数转定点数函数。
原博主所写代码仅适用于单个数字的转换,效率较低,我在他的基础上对其进行简单的修改,加快了运算速度,故展示出来与君共享!
参考博主的链接: 对论文 Deep Learning with Limited Numerical Precision 的理解与结论的验证.
此代码借用了numpy的数组
import numpy as np
FL = 5 # 用5bit表示小数部分
IL = 8 - FL # 用3bit表示整数部分(1bit为符号位,2bit为整数)
MIN = -(1<<(IL-1))
MAX = -MIN - 2**(-FL)
def float_to_fixed_array(x):
global MIN, MAX, FL
x = np.clip(x,MIN,MAX)
sig = np.ones(x.shape) # 符号位
idx = np.where(x<0)
sig[idx] = -1
x = abs(x)
q = np.trunc(x)
x -= q # 此时x为小数部分
e = 1
for i in range(FL):
x *= 2
e /= 2
idx_1 = np.where(x>=1)
x[idx_1] -= 1
q[idx_1] += e
idx_2 = np.where(x>=0.5)
q[idx_2] += e
q *= sig
q = np.clip(q,MIN,MAX)
return q
def float_to_fixed_array_new(x):
# 此版本的结果与上一版本一致,运算速度快于上个版本
global MIN, MAX, FL
x = np.clip(x,MIN,MAX)
idx = np.where(x<0)
x = abs(x)
q = np.trunc(x)
x -= q # 此时x为小数部分
x = np.rint((x * (2 ** FL)) / 1) * (1 / (2 ** FL))
q = q + x
q[idx] = -1*q[idx]
q = np.clip(q,MIN,MAX)
return q