c51单片机浮点数及其汇编程序设计
浮点数的概念
常用的科学计数法来表示一个十进制数如
l234.75=1.23475E3=1.23475×103
在数据很大或很小时,采用科学计数避免了在有效数字前加0来确定小数点的位置,突出了数据的有效数字的位数,简化了数据的表示。可以认为,科学计数法就是十进制数的浮点数表示方法。
在二进制效中,也可以用类似的方法来表示一个数,如
1234.75=10011010010.11(二进制)=0.1001101001011×211
一般表达式为
N=S×2p
在这种表示方法中,数值由四个部分组成,即尾数S及符号,阶码P及符号。
在二进制中,通过定义相应字节或位来表示这四部分,就形成了二进制浮点数。二进制浮点数可以有多种不同的表示方法,下面是一种常见的三字节浮点数的格式:
其中尾数占16位,阶码占6位,阶符占1位,数符占1位。阶码通常用补码来表示。
在这种表示方法中,小数点的实际位置要由阶码来确定,而阶码又是可变的,因此称为浮点数。
1234.75用这种格式的浮点数表示就是:
0000 1011 1001 1010 0101 1000
用十六进制表示为
1234.75=0B9A58H
-1234.75=4B9A58H
0.171875=043B00H
-0.171875=443B00H
三字节浮点数所能表示的最大值为
1×263=9.22×1018
能表示的最小数的绝对值为
0.5×2-63=5.42×10-20
其所表示的数的绝对值范围=(5.42×10-20~9.22×1018),由此可以看到,比三字节定点数表示的数的范围大得多。
按同样方法可以定义一个四字节的浮点数,以满足更高精度的需要。
规格化浮点数
同一个数用浮点数表示可以是不同的,如
1234.75=0B9A58H=0C4D2CH=0D2696H
虽然这几种表示其数值是相同的,但其尾数的有效数字的位数不同,分别为16位、15位和14位。在运算过程中,为了最大限度地保持运算精度,应尽量增加尾数的有效位数。这就需要对浮点数进行规格化处理。
在只考虑用二进制原码表示尾数时,尾数的最高位为l,则该浮点数为规格化浮点数。在规格化浮点数中,用尾数为0和最小阶码表示0,三字节规格化浮点数的0表示为410000H。
浮点数在运算之前和运算之后都要进行规格化,规格化过程包括以下步骤:
(1)首先判断尾是否为0,如果为0,规格化结果为410000H;
(2)如果尾数不为0,判断层数的最高位是否为1,如果不为1,尾数左移,阶码减1;
(3)再判断层数的最高位是否为1,如果不为1,继续进行规格化操作,如果为1,则规格化结束。
浮点数运算
浮点数运算包括加、减、乘、除四则运算,比较运算,开方运算,多项式运算和函数运算。其它运算都可用这些基本运算的组合来完成。本节主要介绍浮点数四则运算及其子程序。
1.浮点数的加、减运算
浮点数的运算就是求结果的尾数、数符、阶码包括阶符的过程。在加、减运算中,参加运算的浮点数的阶码可能是不同的,其尾数所代表的值也是不同的。在这种情况下,尾数不能直接相加或相减,必须首先使两个数的阶相同,这一过程称为对阶。一般是让小阶向大阶对齐,尾数相应右移。对阶相当于算术中的小数点对齐或代数中的通分。尾数相加或相减得到了结果的尾数。数符由尾数的运算结果的符号确定。阶码就是两个数中较大的阶码。
例1 计算132.25+69.75
解: 132.25+69.75=088444H+078B80H=088444H+0845C0H=08CA00H=202
由于两个浮点数的阶码分别为8和7,先将加数的阶码变为8,其尾数右移1位。两个数的阶码相同后,尾数直接相加即为和的尾数,和的尾数的最高位为1,为规格化浮点数。
例2 计算12.39-93.1
解: 12.39-93.1=04C651H-07BA33H=87A169H=-80.71
本例中被减数小于减数,差为负数,结果的数符为1。差的阶码为两个数中较大的阶码。
2.浮点数乘法运算
如果设参加运算的两个操作数分别表示为
Na=(-1)SSa×Sa×2Pa
Nb=(-1)SSb ×Sb×2Pb
它们的积为
N=Na×Nb=(-1)SSa+SSb×(Sa×Sb)×2Pa+Pb
式中SSa和SSb为两个数的数符。
乘法运算可总结为:
(1)积的数符为乘数的符号位和被乘数的符号位按模2求和,即异或;
(2)积的阶为乘数和
c51单片机浮点数汇编程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)