- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AVR單片机程序设计
浮点数运算程序设计
5.1 四字节浮点格式
进行数值运算时,采用定点数运算往往不能满足要求。例短整数(8位带符号数)表示数的范围为-128~+127;整数(16位带符号数)表示数的范围为-32768~+32767;长整数(32位带符号数)表示数的范围为-231~(231-1)。每增加或减少1个数字单位恒为1,这样在绝对值很小的时候,表示的数的精度就很低。为了满足数的范围和精度的要求,常采用浮点数的格式。
二进制浮点数一般采用±M×2E的形式表示。其中M为尾数,是定点数(无符号数),±为数符,E为指数。
若用1位二进制数表示符号位,0为正,1为负;
24位二进制数表示尾数 0.100……0~0.111……1
8位二进制数表示指数,取-125~+128
则表示数的范围就可以扩大为±(0.5×2-125~1.0×2128)
-38~3.4×1038)-24即5.9×10-8。
我们采用的IEEE提出的四字节浮点数标准,恰好能很好表示这个范围的浮点数,其格式为:
最高位(第31位)为数符位,0为正,1为负;低23位(0~22位)为尾数,实际尾数为
0.100……0~0.111……1
第23~30位这8位为阶码。由于指数取值范围为-125~+128,可正可负,为简单起见,阶码采用指数的移码,阶码=指数+$7E。这样阶码恒为正。
阶码为0即浮点数为0(小于1.2×10-38)$78,指数为$78-$7E=-6;
阶码为$88,指数为$88-$7E=10;
阶码为$FF,指数为$ff-$7E=$81超出四字节浮点数的表示范围,表示溢出(即绝对值大于3.4*1038)。
为了方便理解该符点数的格式,下面举几个实际例子。
例:十进制数1=0.5*21,数符为0;阶码为1+$7E=$7F;
尾数0.5=0.100……0b,去掉最高位1,00……0(23位);
四字节浮点数为0011 1111 10……0b 即为$3F 80 00 00
例:0.5=0.5*20,数符为0;阶码为$7E;尾数去掉最高位1为0000……0b(23位);
四字节浮点数为0011 1111 0000……0b 即为$3F 00 00 00。
例:-5=-101=-0.101*23
数符为1;阶码为3+$7E=$81;尾数去掉最高位1为0100……0b(23位);
四字节浮点数为 1100 0000 1010 0000……0b 即为$C0 A0 00 00。
5.2 四字节浮点运算子程序库——AVR32FP.INC
该浮点运算子程序主要有最基本的数值计算(加、减、乘、除运算)和整数到浮点、浮点到整数的转换。该浮点运算子程序库占353个字。共使用寄存器16个并使用了SRAM五个字节。注意:调用加减乘除子程序前必须将Y寄存器置初值,使用的SRAM五个字节的地址为Y-5、Y-4、Y-3、Y-2、Y-1。且应使这五个字节与堆栈区和SRAM其它工作区不要重复。
浮点运算子程序库中包含以下八个子程序:
INT2FP—16位整数转换成四字节浮点数运算子程
LONG2FP—32位长整数转换成四字节浮点数运算子程
FP2INT—四字节浮点数转换成16位整数运算子程
FP2LONG—四字节浮点数转换成32位长整数运算子程
ADD32F—四字节浮点加法运算子程
SUB32F—四字节浮点减法运算子程
DIV32F—四字节浮点除法运算子程
MPY32F—四字节浮点乘法运算子程
由于这八个浮点子程序都是常用的。所以将这些子程序编写在一块,各有自己的入口,又有一些共同的程序段。这样编写可以节省程序存储单元,浮点程序库总共只占353个字,还不到AT90S8535内部Flash的十分之一,一般不至于影响存放用户程序。
以下简单介绍一下各浮点子程序的程序思想:
1.定点长整数(或整数)转换成浮点数:若为整数先将其转换成长整数(正数高16位添0,负数高16位添1);取出符号位及绝对值(正数绝对值不变,负数绝对值取补);将31位绝对值左移至最高位为1,其后23位数即为浮点数尾数(不足23位用0补足);浮点数的阶码为$9d减去左移次数。
2.浮点数取长整(或取整):先判断阶码是否小于$7f,若小于$7f则结果为0;再看阶码是否大于$9d(或$8d),若大于则溢出,正数取$7fffffff(或$7fff),负数取或$8000);否则尾数最高位补1,右移24位尾数($96-阶码)次,即可求得尾数绝对值;取补即得到长整数(或整数)。注:($96-阶码)为负时为低位补0次数。
3.浮点加减法运算:减法可对减数改变符号作加法运算;如一个加数为零或两数的阶码值相差大于尾数长度
文档评论(0)