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 Ex