文章目录1序言二原码是指反码和补码2.1原码表示法2.2反码表示法2.3补码表示法2.4总结在2.4计算机上为什么要用补码进行三十进制数和二进制数之间的转换?从三.1十进制数向二进制数的3.2二进制数的转换是十进制4定点和浮点数的转换概念4.4 2固定点数和浮点数之间的转换4.1.2.1浮点数到固定点数4.1.2.2从固定点数到浮动点数4.1.2.2固定点数到固定点数4.1.3固定点数可表达的数值范围和精度4.1.3固定点数的动态范围4.1.3固定小数点数4.2.1科学计数法4.2.1浮动小数点数的记忆格式4.2.2可以用浮动小数点数表现的数值范围和精度4.2.2浮动小数点运算5总结
1前言
在DSP芯片的介绍中,经常听到固定点数运算、浮点数运算,那么固定点数是什么呢? 浮点数是什么呢? 为了回答这个问题,本文打算谈谈固定分数和浮点数的基本概念。 在此之前,作为预备知识,先介绍原码、反码、补数,再介绍十进制和二进制的变换,最后介绍固定点数和浮点数。
什么是双原码、反转码和补码2.1原码表示法的最高有效位是符号位(正数为0,负数为1 ),而其他位是符号位?
正数源代码是用十进制绝对值大小转换的二进制数字
负数的源代码是用十进制绝对值大小转换的二进制数,最高有效位补充1。
示例:
假设int类型的数量,并且数字为5,则计算机上的显示如下:
00000000 00000000 00000000 00000101
如果将5转换为二进制数,则为101,但int类型的数量占4字节(32位),因此前面填充了0堆。
如果-5表示符号位为1,其他位表示数字,则计算机上的显示如下:
1000000000000000000000000000000000000000000000001。
2.2如果反转表示法为正数,则保持原始代码格式;
对于负数,已编码比特不变化,且该数个原始编码中的其它比特逐比特反转。
如上例所示,5的反码与原始码相同: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-5的反符号保持为已编码比特,其他比特按比特取反,为111111111111111111111111111111111111111111111111111111111111111111111111111111111010
2.3补码表示法只要是正数,则以原始代码形式不变;
对于负数,编码比特不变化,且该数个原符号中的其它比特逐比特反转并加1。
如上例所示,5的补码与原始代码相同: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-5的补码保持原来符号的符号位,其他位按位反转后加1,结果如下。
11111111 11111111 11111111 11111011
2.4在汇总n比特的设备数中,最高位比特是编码比特,该比特为零时为正,1时为负; 剩下的n-1位是数字位,每个位的值可以是0或1。
如果真值为正,则:原码、反码、补码位完全相同;
如果真值为负,则:二维码的数值位保持不变,二维码的数值位将二维码的数值位的各位反转,补码将二维码的最低位加1。 请注意不要让进位进入符号位。
结论:
(1)正数
原码反码完成码
)2)负数
原代码的数值比特保持不变,编码比特为1
反转码比特保持为1,而原码其他比特反转
补数==符号位保持为1,在反符号上加1
2.4计算机中为什么要用补码存储在计算机中? 数据以补数的形式存储。
为什么要采用补充代码存储呢? 这是为了简化计算机的基本运算电路,加减运算都用加法电路实现即可,也就是说,可以通过将正数相加来置换减去正数或加上负数这样的运算。 因此,改变存储负数的形式,直接作为正数存储在可以相加的形式中。 这个形状是补数。 (补数可以直接加减运算。
具体见https://blog.csdn.net/a 1285398438/article/details/88396285。
3359 blog.csdn.net/niusi 1288/article/details/96452179
三十进制数和二进制数之间的转换3.1将十进制数转换为二进制数(1)对于正整数:
"除2外取馀数,按相反顺序排列. "
)2)关于小数:
"用2整理好,按顺序排列. "
示例:
0.6252=1.25取出整数部分1
0.25*2=0.5取出整数部分0
0.52=1========取出整数部分1
所以:
(0.625 ) 10=) 0.101 ) 2
(3)关于正整数小数:
整数部分的二进制表示和小数部分的二进制表示相加即可;
例如,如果上面的173.625=173 0.625,则最终得到的二进制文件如下:
(173.625 ) 10=(10101101.101 ) 2
(4)对于负整数:
显示相应负整数的原始代码,取反后加1 (码位不取反);
)5)关于负整数小数:
可以将负实数写为负整数
小数的形式,然后分别表示出负整数的二进制补码表示和小数部分的二进制表示,然后相加即可。 3.2 二进制的数转换为十进制数方法:按权展开求和。
注意,对于负的十进制数,需要先将二进制减一再取反,得到十进制表示,再进行转换。
具体的转换原理参见:
https://baike.baidu.com/item/%E5%8D%81%E8%BF%9B%E5%88%B6%E8%BD%AC%E4%BA%8C%E8%BF%9B%E5%88%B6/393189?fr=aladdin
在用二进制存储数据时,如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。相比之下,如果小数点的位置可变,则称为“浮点数”。
4.1 定点数定点数的本质是小数,整数只是其表现形式,确定小数点的位置称为定标。常用的定点数有两种表示形式:
(1) 如果小数点位置约定在最低数值位的后面,则该数只能是定点整数;
(2) 如果小数点位置约定在最高数值位的前面,则该数只能是定点小数。
目前计算机中多采用定点纯整数表示,因此将定点数的运算简称为整数运算。
定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。
对于各种整型数据所能表达的数值范围如下:
整数小数点固定在最后,定点数小数位固定使用Qn格式(n表示小数位数)表示,两者都使用二进制补码形式表示。
假设是8位字长,则存储格式是:1位符号位+(7-n)位整数位+n位小数位
比如Q4格式存储的定点数:01010011b
对应的定点数为:122+1*20+12^(-3) +1*2^(-4)=5.1875
定点数与浮点数转化时需要使用2^n的关系进行转化。
4.1.2.1 浮点数到定点数 4.1.2.2 定点数到浮点数 4.1.2.2 定点数到定点数 4.1.3 定点数能够表示的数值范围与精度假设是N位字长的定点运算,假设有n位小数,则:
数值范围:
精度:
由于符号位占1位,所以数据位为N-1,n越大,能表示的数值范围越小,但精度越高。例如,当N=16时,n取不同值时,可表示的数值范围和精度如下所示:
动态范围是指数据格式中最大值与最小值之比。
N位定点数动态范围:
分贝表示:dsp大多采用16位定点数,动态范围为90.3db。
DSP大多采用16位定点数,运算硬件实现较为简单,更大动态范围应用可以使用拓展字长方式。
定点运算的硬件实现较为简单,功耗较小,主要注意的是数据的定标、溢出以及误差。
4.1.3.1 定点数加减运算首先需要保证小数点对齐,但是运算结果可能会溢出。如果进位位与最高位(MSB)相同无溢出,不同则有溢出。处理溢出通常有饱和模式与非饱和模式,饱和模式溢出时会对溢出进行限幅,非饱和模式不会处理,例如:
注意表中都是二进制补码。
DSP处理器都有硬件乘法器和乘法指令,可实现单周期乘法运算。二进制乘法运算包含了移位与加法运算。
定点数乘法不要求小数点位统一,两个相乘数分别为Qn和Qm格式,字长为N,结果为Q(n+m)格式,字长为2N。
在进行运算时,需要字长保持不变,则两个定点小数作乘法运算,结果左移一位,保存高位得到运算结果,结果为Qm(sldgs)格式。
若整数乘小数,则输出结果为整数,丢弃后8位为截尾误差。误差小于等于Qn格式精度的一半,即小于等于 1/(2^(n+1)) 。单次计算误差不大,但连续计算,尤其是递归算法中,误差影响较大。
整数相乘,结果为Q0格式,需查询标志位确定保存的位数,结果不需要左移一位。若结果没有超出8位数的表示范围时,结果在低8位,保存低8位。若结果超出8位数的表示范围时,则高8位也包含乘积结果,应保存整个16位结果。
在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数的范围越大,精度也越高。
以16位字长为例。DSP芯片的数以2的补码形式表示。每个16位数用一个符号位来表示数的正负,0表示数值为正,1则表示数值为负。其余15位表示数值的大小。对DSP芯片而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学运算过程中的数不一定都是整数。那么,DSP芯片是如何处理小数的呢?应该说,DSP芯片本身无能为力(需要人为将小数转化为整数进行运算)。那么是不是说DSP芯片就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。这就是数的定标。不同的定标对应取不同n的Q格式。
比如123.45用十进制科学计数法表示为:1.234510^2
其中给出几个概念:1.2345称为尾数(有效数字的非正式说法),10为基数,2为指数(exponent,也称为阶码)。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。对于一个二进制的数,比如1011.01,用科学计数法可以表示为:1.011012^3。
小数部分占的位( bit)数愈多,数的有效数字愈多(有效数字指的是从左往右第一个不为0的数开始的数的位数),精度愈高。指数部分占的位数愈多,则能表示的数值范围愈大。换句话说就是,浮点数所能表示的范围取决于阶码;精度取决于尾数。
计算机中是用有限的连续字节保存浮点数的。保存这些浮点数当然必须有特定的格式,C中的浮点数类型float和double采用了IEEE 754标准中定义的单精度32位浮点数类型和64位双精度浮点数的格式。
IEEE 754标准,是一种科学计数法。在 IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,指数和尾数。这样,通过尾数和可以调节的指数(所以称为"浮点")就可以表达给定的数值了。浮点数格式:
举例:
浮点数:+27.5
二进制:11011.1
指数式(754标准):1.10111*2^4,即尾数是1.10111,指数为4,符号位为0
因此符号域为0
指数域的值为4+127=131 对应二进制为:1000 0011
尾数域为10111 000000000000000000
因此在计算机中的单精度存储:
0100 0001 1101 1100 0000 0000 0000 0000 ,在DSP中的十六进制表示为0x41DC0000
将十六进制表示的浮点数转换成十进制,则首先要读出浮点数的数符s,阶码e,十进制尾数x,然后按照如下计算公式计算对应的十进制数:(-1)^s * (1 + x) * 2^(e - 127) 4.2.2 浮点数能够表示的数值范围与精度 4.2.2 浮点运算
浮点器件结构较为复杂,但是精度较高,高级语言容易支持。
参考网址:https://blog.csdn.net/tercel_zhang/article/details/52537726
主要介绍了定点数和浮点数的一些基本概念。之后在嵌入式开发中再给出一些相关的实例哈~~~~