1. 对于特定的系统,首先假设有一组浮点数已经存在, 对该数据集使用任意方法/接口将它们构建为一个列表。(下面用一组随机生成数来测试)

2. 将浮点数数fd乘以2的n次方,得到定点数的int表示形式,数据集很有规律的话,这里的n或可以直接根据fd的动态范围肉眼观察直接估算出来一个常数。(肉眼观察法)

3. 也可以使用代码实现自动推导n,实现复用。策略很多,对于无符号数集,下面以实现列表中尽量多的浮点数据*2^n后仍然处于0~65535之间为目标。如果有多个n都满足这一点,则取最大的n。具体而言,由于输入数据是单精度数,且这里问题要求最终转化为16位定点数表示,那么最多遍历127+16就可以了,如果结果是24位定点数,那么就遍历127+24,最终转化定点数的bit宽度可以用fixed bit num设定。

4. 最终吐出的数据,对于转换后个别处于16位定点数表示范围以外的数(如有),做饱和截断处理,也就是大于65535的设为65535,其他范围内的数的浮点部分直接trunc,(当然也可以选用round,ceil,floor舍入)。这个"个别数"允许的个数用extra data num容限约束(不允许例外,或者说要求输入数据集全部满足在定点数表示范围内,那就设0)。输入列表中也可能有负数,这一情形的处理留给题主自己动手考虑下写代码,必然有所收获。

不考虑负数时的参考代码:

def calc_factor(fd_list, fixed_bit_num=16, extra_data_num=0):

if fixed_bit_num < 0:

raise Exception('Invalid fixed_num!', fixed_bit_num)

if extra_data_num < 0:

raise Exception('Invalid extra_data_num !', extra_data_num)

if len(fd_list) < extra_data_num:

raise Exception('length of float data list < extra_data_num make nonsense!')

# if len(fd_list) == 0

# raise Exception('Invalid float data list! ', len(fd_list))

fd_list = fd_list[:]

fd_list.sort()

for n in range(0, fixed_bit_num+127):

if fd_list[-(extra_data_num+1)]*(2**n) >= 2**fixed_bit_num:

current_factor = n - 1

break

else:

current_factor = n

return current_factor

if __name__ == "__main__":

import random

extra_data_num = 5 # 95% match constraint

fixed_bit_num = 16

vector_din = [random.uniform(1, 10) for i in range(100)] # test vector

file = open('translated.txt', 'w')

file.write(r'/'*80 + '\n')

file.write('SET EXTRA DATA TOLERANT NUM: ' + str(extra_data_num) + '\n')

file.write('SET OUTPUT DATA MAX BIT LENGTH: ' + str(fixed_bit_num) + '\n')

file.write('-'*80 + '\n')

file.write('RAW INPUT FLOAT DATA STREAM: ' + '\n' + ' ')

file.write('\n'.join(str(vector_din).split(','))[1:-1])

file.write('\n\n' + r'/'*80 + '\n')

exp_factor = calc_factor(vector_din, fixed_bit_num, extra_data_num)

iter_dout = map(lambda fd: int(fd*(2**exp_factor)), vector_din)

iter_dout_list = list(iter_dout)

sat_dout_list = list(map(lambda int_data: 65535 if int_data >= 65535 else int_data, iter_dout_list))

ro_bit_list = ["{0}'b{1}{2}".format(fixed_bit_num, '0'*(fixed_bit_num - int_data.bit_length()), bin(int_data)[2:]) for int_data in iter_dout_list]

file.write('CALCULATED EXP FACTOR IS: ' + str(exp_factor) + '\n')

file.write('-'*80 + '\n')

file.write('RAW REGULATED OUTPUT DATA STREAM: ' + '\n' + ' ')

file.write('\n'.join(str(iter_dout_list).split(','))[1:-1])

file.write('\n\n' + '-'*80 + '\n')

file.write('SATURATE REGULATED OUTPUT DATA STREAM: ' + '\n' + ' ')

file.write('\n'.join(str(sat_dout_list).split(','))[1:-1])

file.write('\n\n' + '-'*80 + '\n')

file.write('RAW REGULATED OUTPUT BIT STREAM: ' + '\n' + ' ')

file.write('\n'.join(str(ro_bit_list).split(','))[1:-1].replace('"', ''))

file.write('\n')

file.close()

修改代码(略),可实现单精度浮点的完全转换输出,其中二进制输出格式为补码形式,如下:

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐