赞
踩
首先要说明的是,题目《浮点数的定点化》中所谓的 浮点数 并不是指 IEEE754 规定的 单精度浮点数 或者 双精度浮点数 等格式,而是指10进制小数。所以说白了,这篇文章要讲的就是如何将10进制小数采用定点数的形式表示。
你在学习进制转换时,有没有关注过这样一个问题:
为什么10进制小数转成2进制小数的题目通常都会规定有效位数?
例如:将10进制数 0.1 转换为 2进制小数,要求小数有效位数为5位。按照转换方法–乘2直到小数部分为0即可。
那么 0.1(D)= 0.0001100110011····,这时你就会发现,这个乘法过程似乎可以一直持续下去,但是好在题目只要求到小数点后5位,所以结果是 0.00011。
这能说明一个问题:10进制数 0.1 没办法被2进制精准地表示。不过某些小数,在特定的位宽下是可以被2进制精准表示的,比如:
0.5(D)= 0.1(B)
0.25(D)= 0.01(B)
0.875(D)= 0.111(B)
Why?
整数的2进制表示却没有这个问题,只要不限制位宽,那10进制整数一定可以被2进制精准表示,比如:
17(D)用4位2进制数无法表示,因为它的最大范围是4’b1111即15,但可以被5位及更多位的2进制数表示。
关于这一点可以从两个方面去理解:
至此,可以得出结论:并非所有的10进制小数,都可以被2进制数精确表示,在这个进制转换的过程中某些小数一定会存在误差。
将浮点数转为定点数,也叫做 浮点数的定点化。
定点化首先需要约定好定点数的规格:**用几位表示整数,用几位表示小数,要不要表示符号位?**这些规格需要根据输入数据的范围和特性而定(这些往往在算法阶段确定)。
假如要输入的数据 a 的范围在 -9~5 之间,要求精度保留5位。那么绝对值最大的| -9 |至少需要用4位(1001)才能表示,所以整数部分为4位。综上,数据 a 的定点化规格应为:符号位1位,整数部分4位,小数部分5位,共10位。
假设a的一个值是 3.1415,那么它的定点化过程如下:
0_0011_00100表示的值为 +3.125,它和原始数之间的差值就是 量化误差,为|3.125 - 3.1415| = 0.0165。量化误差是在量化过程中因为截断或四舍五入所直接产生的,但本质上还是因为有限个2进制编码无法表示无穷个10进制小数。
浮点数乘以2^Q,然后四舍五入或截去小数,就是定点数。其中Q为定标值(以确定小数位数)。
还是要先说明,这个浮点数不是IEEE754规定的浮点数,仅指10进制小数,显然这就是定点化的逆过程。以 定点数0_0011_00100 的转换为例:
整个过程相对简单,只要将整数部分和小数部分分别从2进制转换为10进制,再结合起来即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。