单片机浮点数计算

单片机浮点数计算
单片机浮点数计算

在单片机应用系统的数据处理过程中,经常会遇到小数的运算问题,如求解BCD的增量算式、线性化处理等。因此,需要用二进制数来表示小数。表示小数的方法一般有两种,定点数和浮点数。定点数结构简单,与整数的运算过程相同,运算速度快。但随着所表示数的范围的扩大,其位数成倍增加,给运算和存储带来不便,而且也不能保证相对精度不变。

浮点数的结构相对复杂,但它能够以固定的字节长度保持相对精度不变,用较少的字节表示很大的数的范围,便于存储和运算,在处理的数据范围较大和要求精度较高时,采用浮点数。

浮点数的概念

常用的科学计数法来表示一个十进制数如

l234.75=1.23475E3=1.23475×103

在数据很大或很小时,采用科学计数避免了在有效数字前加0来确定小数点的位置,突出了数据的有效数字的位数,简化了数据的表示。可以认为,科学计数法就是十进制数的浮点数表示方法。

在二进制效中,也可以用类似的方法来表示一个数,如

1234.75=0.11(二进制)=0.1×211

一般表达式为

N=S×2p

在这种表示方法中,数值由四个部分组成,即尾数S及符号,阶码P及符号。

在二进制中,通过定义相应字节或位来表示这四部分,就形成了二进制浮点数。二进制浮点数可以有多种不同的表示方法,下面是一种常见的三字节浮点数的格式:

其中尾数占16位,阶码占6位,阶符占1位,数符占1位。阶码通常用补码来表示。

在这种表示方法中,小数点的实际位置要由阶码来确定,而阶码又是可变的,因此称为浮点数。

1234.75用这种格式的浮点数表示就是:

00 1011 1001 10 01 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表示为4100H。

浮点数在运算之前和运算之后都要进行规格化,规格化过程包括以下步骤:

(1)首先判断尾是否为0,如果为0,规格化结果为4100H;

(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)积的阶为乘数和被乘数的阶的和;

(3)积的尾数为被乘数和乘数的尾数的积。

参加运算的浮点数一般都是规格化的浮点数,尾数的积小于1,不需进行右规格化处理。但有可能小于0.5,所以需进行左规格化处理,使积为规格化浮点数。如果乘数或被乘数的尾为

0、则积为4100H。由于在尾数相乘时,积的低16位不能反映在结果中,因此,积可能会产生一定的误差。

例3算22.4l×4.23。

解:

22.41×4.23=05B349H×03875EH=07BD9AH=94.8

积的阶为乘数和被乘数的和,即8。尾数相乘时,积小于0.5,进行左规格化处理,阶码变为7。

例4计算2586.5×(-6.91)。

解:

2586.5×(-6.91)=0CA1BOH×83DD13H=8F8BA0H=-17872

被乘数为正数,数符为0,乘数为负数,数符为1,积的数符为0⊕1=1,积为负数。

3.浮点数的除法运算

除法运算可以表示为

N=Na/Nb=[(-1)SSa×Sa×2Pa]/[(-1)SSb×Sb×2Pb ]

=(-1)SSa-SSb×(Sa/Sb) ×2Pa-Pb

浮点数的除法运算可以总结为:

(1)商的数符为被除数与除数的符号位的差;

(2)商的阶码为被除数和除数的阶码的差;

(3)商的尾数为被除数和除数的尾数的商。

规格化的浮点数进行除法运算时,尾数相除,商不会小于0.5,不需进行左规格化处理。但有可能大于1,有时需进行右规格化处理。例5计算

390.67÷14.3l。

解:

390.67÷14.31=09C357H÷04E511H=05DA4EH=27.3

商的阶码为被除数与除数的阶码的差。尾数相除时,结果的最高位为1,商为规格化浮点数。

例6计算-6.02÷16.157。

解:

-6.02÷16.157=83C0AAH÷058143H=FFBEC8H=-0.373

异号相除时,商为负数。由于被除数的尾数大于除数的尾数,所以被除数先进行右规格化,阶码变为4,商的阶码为-1,用补码来表示。

浮点数运算子程序

通过前面的分析可以看到,浮点运算比较复杂,有其特有的方法和规律。这里介绍几种常用的三字节浮点数运算子程序,通过分析、设计这些程序,可以进一步了解浮点数的运算过程和特点,熟悉复杂程序的设计方法。

1.浮点数通用规格化子程序

在浮点数运算过程中,有时需要左规格化,有时需要右规格化。通过规格化子程序既可实现左规格化,又可实现右规格化,其具体功能如下:

当Cy=0时,进行右规格化:

F0=0时.对R6(阶)R2R3(尾数)右规格化1位;F0=1时,对R7(阶)R4R5(尾数)右规格化1位。

当Cy=1时,对R6(阶)R3(尾数)执行左规格化。

程序开始时,判断是执行左规格化还是右规格化。如果是右规格化,还要判断是对R6(阶)R2R3(尾数)还是对R7(阶)R4R5(尾数)进行规格化。如果是左规格化,直至把操作数变为规格化浮点数。其程序框图如图4-13所示。程序为:

FSDT:

JC LNORMS

MOV C, 39H ;进行右规格化

JB F0, NR7

MOV A, R2;R2R3右移一位

RRC A ;(Cy)移入尾数最高位

MOV R2, A

MOV A, R3

RRC A

MOV R3, A

INC R6;阶码加1

RET

NR7: MOV A, R4

RRC A

MOV R4, A

MOV A, R5

RRC A

MOV R5, A

INC R7

RET

LNORMS:

MOV A, R7

JNZ LSHIFT

CJNE R3, #00H, LSBIT8;尾数为0,阶码41H MOV R6, #41H

LSEND :

RET

LSHIFT:

JB ACC.7, LSEND

LSBIT8: MOV C, F0

MOV A, R3

RLC A

MOV R3, A

MOV A, R2

RLC A

MOV R2, A

CLR F0

DEC R6

SJMP LNORMS

2.浮点数加减运算子程序

参加运算的浮点数可能是正数,也可能是负数。对于加法运算.当加数和被加数的数符相同时,尾数相加,不同时尾数相减;对于减法运算,当减数和被减数的数符相同时,尾数相减、不同时尾数相加。当两个浮点数的阶码不同时,要进行对阶,使小阶与大阶相等,因此,结果的阶码与其较大的阶码相同。

在执行加法运算时,尾数有可能大于1,因此要进行右规格化处理;执行减法运算时,尾数有可能小于0.5,因此,要进行左规格化处理。

下面是三字节浮点数加、减法处理于程序,具体功能为:

R6(阶)R2R3(尾)±R7(阶)R4R5(尾)→R4(阶)R2R3(尾);

当位3AH=0时,执行加法;

当位3AH=1时,执行减法。

程序框图如图4—14所示。程序如下:

FABP:

MOV A, R6

MOV C, ACC.7

MOV 38H, C ;存被加数数符

XRL A, R7

JNB ACC.7, FAB1;数符相同则转

CPL 3AH ;数符不等,求反运算标志

图4-14

FAB1: MOV A, R6

MOV C, ACC.6;扩展阶码符号位

MOV ACC.7, C

MOV R6, A

MOV A, R7

CLR C

MOV A, R6

SUBB A, R7

JZ FAB2;阶码相同则转

CLR F0

JB ACC.7, FAB6

CJNE R4, #00H, FAB7

CJNE R5, #00H, FAB7

FAB2: JB 3AH, FAB9;转向尾数减法MOV A, R3;执行尾数加法

ADD A, R5

MOV R3, A

ADD A, R2

ADDC A, R4

MOV R2, A

JNC FAB4

SETB 39H

CLR C

FAB3: CLR F0

LCALL FSDT

FAB4: CJNE R2, #00H, FAB5 CJNE R3, #00H, FAB5

MOV R4, #41;结果为0,规格化RET

FAB5: MOV A, R6

MOV C, 38H

MOV ACC.7, C

XCH A, R4

MOV R6, A

RET

FAB6: CJNE R2, #00H, FAB8 CJNE R3, #00H, FAB8

MOV A, R7

MOV R6, A

SJMP FAB2

FAB7: CPL F0

FAB8: CLR C

LCALL FSDT

SJMP FAB1

FAB9: MOV A, R3;尾数相减

CLR C

SUBB A, R5

MOV R3, A

MOV A, R2

SUBB A, R4

MOV R2, A

JNC FAB10

CLR A

CLR C

SUBB A, R3

MOV R3, A

CLR A

SUBB A, R2

MOV R2, A

CPL 38H

FAB10: SETB C

SJMP FAB3

3.浮点数乘法运算子程序

浮点数相乘时,阶码直接相加即获得积的阶码,尾数相乘时,结果可能小于0.5,需进行左规格化处理。下面是三字节浮点数乘法运算子程序,具体功能为:

(Ro)指向的三字节浮点数×(R1)指向的三字节浮点数→R4(阶)R2R3(尾数)。

图4-15三字节浮点数乘法的程序框图。程序为:FMUL:

LCALL FMLD ;传送浮点数

MOV A, R6;求积的数符

XRL A, R7

MOV C, ACC.7

MOV 38H, C

LCALL DMUL ;调用双字节无符号数乘法子程序MOV A, R7

MOV C, ACC.7

MOV F0, C

MOV A, @R0

ADD A, @R1

MOV R6, A

SETB C

LCALL FSDT ;进行规格化操作

图4-15三字节浮点数乘法子程序

MOV A, R6

MOV C, 38H

MOV ACC.7, C ;置积的数符

MOV R4, A

RET

注:

(1)FMLD为浮点数取数子程序,功能为:

将(R0)指向的三字节浮点数送入R6(阶)R2R3(尾数)中,将(R1)指向的三字节浮点数送入R7(阶)R4R5(尾数)中。

(2)DMUL为双字节无符号数乘法子程序。

4.浮点数除法运算子程序

在进行除法运算时,被除数的尾数可能比除数的尾数大很多,使结果大于1。为避免这种情况,如果被除数尾数大于除数的尾数,先将被除数的尾数右移,使其小于除数的尾数。阶码也相应增加,保持其数值不变。下面是三字节浮点数除法运算程序,其功能为:

(R0)指向的三字节浮点数除以(R1)指向的三字节浮点数→R4(阶)R2R3(尾数)中。

程序框图如图4-16所示。程序为:

FDIV:

LCALL FMLD

MOV A, R6

XRL A, R7;求商的数符

MOV C, ACC.7

MOV 38H, C

CLR A

MOV R6, A

MOV R7, A

CJNE R4, #00H, FDIV1

CJNE R5, #00H, FDIV1

SETB C

RET ;除数为0返回FDIV1: MOV A, R3;比较被除数与

SUBB A, R5;除数的尾数

MOV A, R2

SUBB A, R4

JC FDIV2

CLR F0

CLR 39H

LCALL FDST

RRC A

MOV R7, A

CLR C

SJMP FDIV1

FDIV2: CLR A

XCH A, R6

PUSH ACC

LCALL DDIV ;调用双字节除法程序POP ACC

ADD A, @R0

CLR C SUBB A, @R1

MOV C, 38H MOV ACC.7, C MOV R4, A CLR C

RET

浮点数的表示和基本运算

浮点数的表示和基本运算 1 浮点数的表示 通常,我们可以用下面的格式来表示浮点数 S P M 其中S是符号位,P是阶码,M是尾数 对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 S P M表示公式偏移量 1823(-1)S*2(P-127)*1.M127 11152(-1)S*2(P-1023)*1.M1023 以单精度浮点数为例,可以得到其二进制的表示格式如下 S(第31位)P(30位到 23位) M(22位到 0位) 其中S是符号位,只有0和1,分别表示正负;P是阶码,通常使用移码表示(移码和补码只有符号位相反,其余都一样。对于正数而言,原码,反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1.) 为了简单起见,本文都只讨论单精度浮点数,双精度浮点数也是用一样的方式存储和表示的。 2 浮点数的表示约定 单精度浮点数和双精度浮点数都是用IEEE754标准定义的,其中有一些特殊约定。 (1) 当P = 0, M = 0时,表示0。 (2) 当P = 255, M = 0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。

(3) 当P = 255, M != 0时,表示NaN(Not a Number,不是一个数)。 当我们使用.Net Framework的时候,我们通常会用到下面三个常量 Console.WriteLine(float.MaxValue); // 3.402823E+38 Console.WriteLine(float.MinValue); //-3.402823E+38 Console.WriteLine(float.Epsilon); // 1.401298E-45 //如果我们把它们转换成双精度类型,它们的值如下 Console.WriteLine(Convert.ToDouble(float.MaxValue)); // 3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.MinValue)); //-3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.Epsilon)); // 1.40129846432482E-45 那么这些值是如何求出来的呢? 根据上面的约定,我们可以知道阶码P的最大值是11111110(这个值是254,因为255用于特殊的约定,那么对于可以精确表示的数来说,254就是最大的阶码了)。尾数的最大值是11111111111111111111111。 那么这个最大值就是:0 11111110 11111111111111111111111。 也就是 2(254-127) * (1.11111111111111111111111)2 = 2127 * (1+1-2-23) = 3.40282346638529E+38 从上面的双精度表示可以看出,两者是一致的。最小的数自然就是- 3.40282346638529E+38。 对于最接近于0的数,根据IEEE754的约定,为了扩大对0值附近数据的表示能力,取阶码P = -126,尾数 M = (0.00000000000000000000001)2 。此时该数的二进制表示为:0 00000000 00000000000000000000001 也就是2-126 * 2-23 = 2-149 = 1.40129846432482E-45。这个数字和上面的Epsilon 是一致的。 如果我们要精确表示最接近于0的数字,它应该是 0 00000001 00000000000000000000000 也就是:2-126 * (1+0) = 1.17549435082229E-38。 3 浮点数的精度问题 浮点数以有限的32bit长度来反映无限的实数集合,因此大多数情况下都是一个近似值。同时,对于浮点数的运算还同时伴有误差扩散现象。特定精度下看似

数的定点表示和浮点表示

计算机处理的数值数据多数带有小数,小数点在计算机常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为x=x0.x1x2… xn(其中x0为符号位,x1~xn是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位xn= 1,前面各位都为0,则数的绝对值最小,即|x|min= 2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示围是:

2-n≤|x|≤1 -2-n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x的形式为x=x0x1x2…xn(其中x0为符号位,x1~xn是尾数,xn为最低有效位),则在计算机中的表示形式为: 定点整数的表示围是: 1≤|x|≤2n-1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原

51单片机课设 串口计算器

[二0一三年]

1作品简介 本作品为带有串口通信功能的计算器,PC可通过串口助手软件将算式发送至单片机,单片机立即将计算结果发送回PC,并且在液晶上显示结果。串口通信波特率为两档可调,分别为9600bps和4800bps,可通过两个按键调整,同时在液晶上会显示当前的波特率。 计算器可自动识别输入的字符串,并自动判断输入的算式是否正确;可自动识别算式中包含错误字符、除数为零、浮点数做取余运算等错误。当计算结果超出设定范围时在液晶上出现“超出范围”提示,同时向PC发送“The result is out of range! ”。 2作品整体方案 2.1 串行通信功能: 实验板和PC电脑通过USB线相连,使MCU和PC软件“串口助手”能够进行串行通信。 (1)当实验板上电时默认波特率为9600bps,并发送欢迎词和提示词,例如“Welcome to Calculator V1.0”,"You can press key1 and key2 to change baud rate.".... (2)当实验板上按键1按下时波特率变更为4800bps,按键2按下时波特率变更为9600bps,并用两个LED灯指示相应的波特率。 2.2 计算器功能 通过串口助手发送框发送需要计算的公式,例如20*4=,MCU收到后解析公式并计算结果,将结果返回给串口,例如“The result is 80”,同时将计算结果显示在数码管上,具体细节如下: (1)可以进行加(+)、减(-)、乘(*)、除(\)、取余(%)运算; (2)整形、浮点型运算; (3)当计算结果为整形数时,有效的运算结果范围是-999~9999,超过此结果,返回相应的提示符,例如“The result is out of range.”,液晶上显示“超出范围”; (4)当计算结果为浮点数时,有效的运算结果范围是-99.9~999.9,液晶上保

浮点数的表示和运算(范围计算)

浮点数的表示和运算 浮点数的表示和基本运算 1 浮点数的表示 通常,我们可以用下面的格式来表示浮点数 其中S是符号位,P是阶码,M是尾数 对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 以单精度浮点数为例,可以得到其二进制的表示格式如下 其中S是符号位,只有0和1,分别表示正负;P是阶码,通常使用移码表示(移码和补码只有符号位相反,其余都一样。对于正数而言,原码,反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1.) 为了简单起见,本文都只讨论单精度浮点数,双精度浮点数也是用一样的方式存储和表示的。 2 浮点数的表示约定 单精度浮点数和双精度浮点数都是用IEEE754标准定义的,其中有一些特殊约定。 (1)当P = 0, M = 0时,表示0。 (2)当P = 255, M = 0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。 (3)当P = 255, M != 0时,表示NaN(Not a Number,不是一个数)。 当我们使用.Net Framework的时候,我们通常会用到下面三个常量 Console.WriteLine(float.MaxValue); // 3.402823E+38 Console.WriteLine(float.MinValue); //-3.402823E+38 Console.WriteLine(float.Epsilon); // 1.401298E-45 //如果我们把它们转换成双精度类型,它们的值如下 Console.WriteLine(Convert.ToDouble(float.MaxValue)); // 3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.MinValue)); //-3.40282346638529E+38 Console.WriteLine(Convert.ToDouble(float.Epsilon)); // 1.40129846432482E-45 那么这些值是如何求出来的呢?

关于单片机的一些小实验_04利用IO口线模拟同步串口驱动74HC595控制八个LED灯花样显示

***************************************************************** *************************** *功能: 利用IO 口线模拟同步串口驱动74HC595控制LED1~LED这八个LED灯进行花样流水灯显示。 *硬件条件:1.CPU型号: AT89S52 *2. 晶振:12.000MHz *3. 用短接P2.3__SI2 * 用短接P2.2__RCK2 *用短接P2.1__SCK2 * 日期: 2014 年04 月24 号 ***************************************************************** ****************************/ #include "reg52.h"// 包含头文件 /* 与编译器无关的数据类型定义*/ /***************************************************************** ***************************/ typedef unsigned char uint8;// 无符号8 位整型变量 typedef signed char int8;// 有符号8 位整型变量 typedef unsigned short uint16;// 无符号16 位整型变量

typedef signed short int16;// 有符号16 位整型变量 typedef unsigned int uint32;// 无符号32 位整型变量 typedef signed int int32;// 有符号32 位整型变量 typedef float fp32;// 单精度浮点数( 32 位长度) typedef double fp64;// 双精度浮点数( 64 位长度) /********************************************************************* ***********************/ /* 定义位变量*/ sbit P2_3 = P2 八 3; sbit P2_2 = P2 八 2; sbit P2_1 = P2 八 1; sbit P2_0 = P2 八 0; #defineSI2_H()(P2_3=1)/定义"SI2_H)为P2.3输出高电平,作为74HC595_2 的数据输入信号 #define SI2_L()(P2_3=0)/定义"SI2_L()'为P2.3输出低电平,作为74HC595_2 的数据输入信号 #define RCK2_H()(P2_2=1)定义"RCK2_H()为P2.2输出高电平,作为 74HC595_2的片选输入信号 #define RCK2_L()(P2_2=0)定义"RCK2_L()为P2.2输出低电平,作为 74HC595_2的片选输入信号 #define SCK2_H()(P2_1=1)定义"SCK2_H()为P2.1 输出高电平,作为 74HC595_2的时钟输入信号 #defineSCK2_L()(P2_仁0)定义"SCK2_L()为P2.1 输出低电平,作为 74HC595_2的时钟输入信号

浮点数的表示和计算

《计算机组成原理》实验报告

sw $aO, O($fp) #calculate the first nu mber andi $s2, $s0, 0x80000000 # s2 is the sig n srl $s2, $s2, 31 andi $s3, $s0, 0x7f800000 # s3 is the exp onent srl $s3, $s3, 23 andi $s4, $s0, 0x007fffff # s4 is the fractio n addi $s4, $s4, 0x00800000 #calculate the seco nd number andi $s5, $s1, 0x80000000 # s5 is the sig n srl $s5, $s5, 31 andi $s6, $s1, 0x7f800000 # s6 is the exp onent srl $s6, $s6, 23 andi $s7, $s1, 0x007fffff # s7 is the fractio n addi $s7, $s7, 0x00800000 sub $t0, $s3, $s6 bit $t0, 0, sumL1 # add sub bgt $t0, 0, sumL2 # sub add beq $t0, 0, sumL3 2.减法指令如下: mysub: subu $sp, $sp, 32 sw $ra, 20($sp) sw $fp, 16($sp) addiu $fp, $sp, 28 sw $a0, 0($fp) #calculate the first nu mber andi $s2, $s0, 0x80000000 # s2 is the sig n srl $s2, $s2, 31 andi $s3, $s0, 0x7f800000 # s3 is the exp onent srl $s3, $s3, 23 andi $s4, $s0, 0x007fffff # s4 is the fractio n addi $s4, $s4, 0x00800000 #calculate the seco nd number xori $s5, $s1, 0x80000000 # s5 is the sig n srl $s5, $s5, 31 andi $s6, $s1, 0x7f800000 # s6 is the exp onent srl $s6, $s6, 23 andi $s7, $s1, 0x007fffff # s7 is the fractio n addi $s7, $s7, 0x00800000 sub $t0, $s3, $s6 blt $t0, 0, subL1 # +,- bgt $t0, 0, subL2 # -,+ beq $t0, 0, subL3 # +,+ or -,- 3.乘法指令如下: mutilStart: srl $t2, $s0, 31 srl $t3, $s1, 31 sll $t4, $s0, 1

仪表整型数据到浮点数的转化

我们的专业专项在工科方面:计算机工程,电子信息工程,自动化控制,电力电子工程,机械工程,土木工程,道路与桥组态王与单片机协议 1.通讯口设置: 通讯方式:RS-232,RS-485,RS-422均可。 波特率: 由单片机决定。 字节数据格式: 起始位、数据位、停止位均由单片机决定。 2.设备地址设置 格式:##.# (前面的两个字符是设备地址,范围为0-255;后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包。) 3.寄存器设置 4.格式:读写格式(除字头外所有字节均为ASCII 码) 说明; 字头:1字节,40H 设备地址: 2字节,0—255(即0---0x0ffH ) 标志:1字节,bit0~bit7,bit0= 0:读,bit0= 1:写。Bit1= 0:不打包, bit3bit2 = 00,数据类型为字节。 bit3bit2 = 01,数据类型为字。 bit3bit2 = 1x,数据类型为浮点数。 数据地址: 2字节,0x0000~0xffff 数据字节数:1字节,1—100,实际读写的数据的字节数。 数据…:为实际的数据 异或:异或从设备地址到异或字节前 CR : 0x0d 。 5.上位机发送读命令 下位机应答:若正常: 若不正常: 例:读12号仪表,数据地址为15的数据。其中数据为255,数据类型为字节,不打包。所发数据为:

我们的专业专项在工科方面:计算机工程,电子信息工程,自动化控制,电力电子工程,机械工程,土木工程,道路与桥 若正确: 若不正确: 4.上位机发送写命令 下位机应答:若正常: 若不正常: 例:写12号仪表,数据地址为15。其中数据为255,数据类型为字节,不打包。所发数据为: 若正确: 若不正确: 6.浮点数格式: 4字节浮点数 = 第一字节高4位ASCII 码+第一字节低4位ASCII 码 +第二字节高4位ASCII 码+第二字节低4位ASCII 码 +第三字节高4位ASCII 码+第三字节低4位ASCII 码 +第四字节高4位ASCII 码+第四字节低4位ASCII 码 位 第1字节高4位 第2字节高4位 第3字节高4位 第4字节高4位 ★ 四字节浮点数格式: (1)第一字节

51单片机浮点运算子程序库

51单片机浮点运算子程序库 时间:2007-11-14 来源: 作者: 点击:4020 字体大小:【大中小】 1: FSDT 功能:浮点数格式化 2: FADD 功能:浮点数加法 3: FSUB 功能:浮点数减法 4: FMUL 功能:浮点数乘法 5: FDIV 功能:浮点数除法 6: FCLR 功能:浮点数清零 7: FZER 功能:浮点数判零 8: FMOV 功能:浮点数传送 9: FPUS 功能:浮点数压栈 10: FPOP 功能:浮点数出栈 11: FCMP 功能:浮点数代数值比较不影响待比较操作数 12: FABS 功能:浮点绝对值函数 13: FSGN 功能:浮点符号函数 14: FINT 功能:浮点取整函数 15: FRCP 功能:浮点倒数函数 16: FSQU 功能:浮点数平方 17: FSQR 功能:浮点数开平方快速逼近算法 18: FPLN 功能:浮点数多项式计算 19: FLOG 功能:以10为底的浮点对数函数 20: FLN 功能:以e为底的浮点对数函数 21: FE10 功能:以10为底的浮点指数函数 22: FEXP 功能:以e为底的浮点指数函数 23: FE2 功能:以2为底的浮点指数函数 24: DTOF 功能:双字节十六进制定点数转换成格式化浮点数 25: FTOD 功能:格式化浮点数转换成双字节定点数 26: BTOF 功能:浮点BCD码转换成格式化浮点数 27: FTOB 功能:格式化浮点数转换成浮点BCD码 28: FCOS 功能:浮点余弦函数 29: FSIN 功能:浮点正弦函数 30: FATN 功能:浮点反正切函数 31: RTOD 功能:浮点弧度数转换成浮点度数 32: DTOR 功能:浮点度数转换成浮点弧度数 为便于读者使用本程序库,先将有关约定说明如下: 1.双字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据,地址小的单元存放高字节?如果[R0]=1234H,若(R0)=30H,则(30H)=12H,(31H)=34H? 2.二进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示?当尾数的最高位为1时,便称为规格化浮点数,简称操作数?在程序说明中,也用[R0]或[R1]来表示R0或R1指示的浮点操作数,例如:当[R0]=-6.000时,则二进制浮点数表示为83C000H?若(R0)=30H,则 (30H)=83H,(31H)=0C0H,(32H)=00H? 3.十进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节

浮点数表示方法与运算

在计算机系统的发展过程中,曾经提出过多种方法表达实数,典型的比如定点数。在定点数表达方式中,小数点位置固定,而计算机字长有限,所以定点数无法表达很大和很小的实数。最终,计算机科学发展出了表达范围更大的表达方式——浮点数,浮点数也是对实数的一种近似表达。 1.浮点数表达方式 我们知道任何一个R 进制数N 均可用下面的形式表示:N R =±S ×R ±e 其中,S—尾数,代表N 的有效数字; R—基值,通常取2、8、16;e—阶码,代表N 的小数点的实际位置(相当于数学中的指数)。 比如一个十进制数的浮点表达1.2345×102,其中1.2345为尾数,10为基数,2为阶码。一个二进制数的浮点表达0.001001×25,0.001001为尾数,2为基数,5为阶码;同时0.001001×25也可以表示成0.100100×23,0.100100为尾数,2为基数,3为阶码。浮点数就是利用阶码e 的变化达到浮动小数点的效果,从而灵活地表达更大范围的实数。 2.浮点数的规格化 一个数用浮点表示时,存在两个问题:一是如何尽可能多得保留有效数字;二是如何保证浮点表示的唯一。 对于数0.001001×25,可以表示成0.100100×23、0.00001001×27等等,所以对于同一个数,浮点有多种表示(也就是不能唯一表示)。另外,如果规定尾数的位数为6位,则0.00001001×27会丢掉有效数字,变成0.000010×27。因此在计算机中,浮点数通常采用规格化表示方法。 当浮点数的基数R 为2,即采用二进制数时,规格化尾数的定义为:1/2<=|S|<1。若尾数采用原码(1位符号位+n 位数值)表示,[S]原=S f S 1S 2S 3…S n (S f 为符号位的数符),则满足S 1=1的数称为规格化数。即当尾数的最高有效位S 1=1,[S]原=S f 1S 2S 3…S n ,表示该浮点数为规格化数。对0.001001×25进行规格化后,表示为0.100100×23。 3.浮点数的表示范围 求浮点数的表示范围,实质是求浮点数所能表示的最小负数、最大负数、最小正数和最大正数。

浮点数和定点数的区别

cloudseawang 定点数与浮点数区别 最近做HDR时,经常要用NV提供的16位纹理,它的说明书16位能达到24位的精度,就很奇怪?一直搞不懂浮点数的精度怎么算的? 今天认真看了一下IEEE float point的标准,终于明白是什么了 1. 什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如99.00 或者00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。 定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如123.45 用十进制科学计数法可以表达为1.2345 × 102 ,其中1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。 提示: 尾数有时也称为有效数字(Significand)。尾数实际上是有效数字的非正式说法。同样的数值可以有多种浮点数表达方式,比如上面例子中的123.45 可以表达为12.345 ×101,0.12345 × 103 或者1.2345 × 102。因为这种多样性,有必要对其加以规范化以达到统一表达的目标。规范的(Normalized)浮点数表达方式具有如下形式: ±d.dd...d × β e , (0 ≤ d i < β) 其中 d.dd...d 即尾数,β 为基数,e 为指数。尾数中数字的个数称为精度,在本文中用p 来表示。每个数字d 介于0 和基数之间,包括0。小数点左侧的数字不为0。 基于规范表达的浮点数对应的具体值可由下面的表达式计算而得: ±(d 0 + d 1β-1 + ... + d p-1β-(p-1))β e , (0 ≤ d i < β) 对于十进制的浮点数,即基数β 等于10 的浮点数而言,上面的表达式非常容易理解,也很直白。计算机内部的数值表达是基于二进制的。从上面的表达式,我们可以知道,二进制数同样可以有小数点,也同样具有类似于十进制的表达方式。只是此时β 等于2,而每个数字d 只能在0 和 1 之间取值。比如二进制数1001.101 相当于1 × 2 3 + 0 × 22 + 0 ×21 + 1 ×20 + 1 ×2-1 + 0 ×2-2 + 1 ×2-3,对应于十进制的9.625。其规范浮点数表达为1.001101 × 23。 2. IEEE 浮点数 计算机中是用有限的连续字节保存浮点数的。保存这些浮点数当然必须有特定的格式,Java 平台上的浮点数类型float 和double 采纳了IEEE 754 标准中所定义的单精度32 位浮点数和双精度64 位浮点数的格式。 注意: Java 平台还支持该标准定义的两种扩展格式,即float-extended-exponent 和double-extended-exponent 扩展格式。这里将不作介绍,有兴趣的读者可以参考相应的参考资料。 在IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,

单片机实验2【完整】代码

电子系统综合设计报告 学号201009120229 姓名李文海 年级专业2010级电子信息工程(二) 指导教师刘怀强 学院理学院

走马灯实验论文--《嵌入式系统技术》 1、实验目的 1、学会DP-51PRO实验仪监控程序下载、动态调试等联机调试功能的使用; 2、理解和学会单片机并口的作为通用I/O的使用; 3、理解和学会单片机外部中断的使用; 4、了解单片机定时器/计数器的应用。 2、实验设备 z PC 机、ARM 仿真器、2440 实验箱、串口线。 3、实验内容 z熟悉A RM 开发环境的建立。 z使用A RM 汇编和C语言设置G PIO 口的相应寄存器。 z编写跑马灯程序。 5、实验原理 走马灯实验是一个硬件实验,因此要求使用DP-51PRO 单片机综合仿真实验仪进行硬件仿真,首先要求先进行软件仿真,排除软件语法错误,保证关键程序段的正确。然后连接仿真仪,下载监控程序,进行主机与实验箱联机仿真。 为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序间的调用规定一定的规则。ATPCS ,即ARM ,Thumb 过程调用标准(ARM/Thumb Procedure Call Standard),是A RM 程序和T humb 程序中子程序调用的基本规则,它规定了一些子程序间调用的基本规则,如子程序调用过程中的寄存器的使用规则,堆栈的使用规则,参数的传递规则等。 下面结合实际介绍几种A TPCS 规则,如果读者想了解更多的规则,可以查看相关的书 籍。 1.基本A TPCS 基本A TPCS 规定了在子程序调用时的一些基本规则,包括下面3方面的内容: (1)各寄存器的使用规则及其相应的名称。 (2)数据栈的使用规则。 (3)参数传递的规则。 相对于其它类型的A TPCS,满足基本A TPCS 的程序的执行速度更快,所占用的内存更少。但是它不能提供以下的支持:ARM 程序和T humb 程序相互调用,数据以及代码的位置无关的支持,子程序的可重入性,数据栈检查的支持。 而派生的其他几种特定的ATPCS 就是在基本ATPCS 的基础上再添加其他的规则而形成的。其目的就是提供上述的功能。 2.寄存器的使用规则 寄存器的使用必须满足下面的规则:

浮点数加减运算课件

如果一个二进制浮点数的尾数的绝对值小于1并且大于等于0.5,(1>|尾数|≥0.5),那么这个二进制浮点数就是一个规格化的浮点数。 用二进制补码表示1个规格化的浮点数,并且规格化的浮点数的尾数只有一个符号位时: 规格化的浮点数的尾数是正数时应该是0 . 1 X X X X X X X X X ……的形式 (0表示符号位,X表示0或1中的任意一个数值) 规格化的浮点数的尾数是负数时应该是1 . 0 X X X X X X X X X ……的形式 (1表示符号位,X表示0或1中的任意一个数值) 用二进制补码表示1个规格化的浮点数,并且规格化的浮点数的尾数只有两个符号位时: 规格化的浮点数的尾数是正数时应该是00 . 1 X X X X X X X X X ……的形式 (00表示符号位,X表示0或1中的任意一个数值) 规格化的浮点数的尾数是负数时应该是11 . 0 X X X X X X X X X ……的形式 (11表示符号位,X表示0或1中的任意一个数值) 两个浮点数加减法的计算结果必须规格化,如果不是规格化的数,则要通过修改阶码并同时左移或者右移尾数,使其变为规格化的数。 [例] x=2010×0.11011011,y=2100×-0.10101100,浮点数均以补码表示,阶码采用双符号位,尾数采用单符号位。求x+y 。 答: (步骤1)转换成题目中要求的浮点数格式: 浮点数x=2010×0.11011011的阶码是+010,尾数是+0.11011011 浮点数均以补码表示,所以阶码以补码表示,并且阶码采用双符号位, [x]浮的阶码=00010(00是两个符号位) 浮点数均以补码表示,所以尾数以补码表示,并且尾数采用单符号位, [x]浮的尾数=0.11011011(0是1个符号位)

数的定点表示和浮点表示

计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为x=x0.x1x2… xn(其中x0为符号位,x1~xn是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位xn= 1,前面各位都为0,则数的绝对值最小,即|x|min= 2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示范围是:

2-n≤|x|≤1 -2-n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x的形式为x=x0x1x2…xn(其中x0为符号位,x1~xn是尾数,xn为最低有效位),则在计算机中的表示形式为: 定点整数的表示范围是: 1≤|x|≤2n-1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原

浮点数计算方式

2.3.4二进制转10进制及10进制转为二进制 【例2-3-4】 把二进制110.11转换成十进制数,及十进制转为二进制。 解: (110.11)2 =1×22+1×21+1×20+1×2-1+1×2-2 =4+2+0+0.5+0.25=(6.75)10 把十进制转换为二进制 解: 2 6 0 2 3 1 1 1 所以实数部分为110 0.75×(2×2-1)=0.75×2×2-1 =1×2-1+0.5×2-1 =1×2-1+1×2-2 所以结果为:(110.11)2 2.3.5 浮点数在计算机中存储形式 当前主流微机中广泛采用的IEEE754标准浮点格式。 按IEEE754标准,常用的浮点数(32位短实数)的格式如图2-3所示。

IEEE754标准浮点格式 N=2e.M (M为浮点尾数,为纯小数,e为浮点数的指数(阶码))尾数部分决定了浮点数的精度,阶码决定了表示范围32为浮点数(IEEE754标准格式0—22为尾数M,23-30为阶码E,31为符号位S),阶码用移码表示。阶码E=指数真值e+127 规格化真值x=(-1)^S*(1.M)*2^(E-127) 将(82.25)10 转换成短浮点数格式。 1)先将(82.25)10 转换成二进制数 (82.25)10 =(1010010.01)2 2)规格化二进制数(1010010.01)2 1010010.01=1.01001001×2 6 尾数M=01001001 3)计算移码表示的阶码=偏置值+阶码真值: E=127+6=133=10000101 4)以短浮点数格式存储该数 因此:符号位=0 S=0表示该数为正数 阶码=10000101 由3)可得 尾数=01001001000000000000000 由2)可得;尾数为23位, 不足在后面添15位0 所以,短浮点数代码为: 0;10000101;01001001000000000000000 表示为十六进制代码为:42A48000H

浮点数的加减乘除运算步骤

设两个浮点数X=Mx※2Ex Y=My※2Ey 实现X±Y要用如下5步完成: ①对阶操作:小阶向大阶看齐 ②进行尾数加减运算 ③规格化处理:尾数进行运算的结果必须变成规格化的浮点数,对于双符号位的补码尾数来说,就必须是001×××…×× 或110×××…××的形式, 若不符合上述形式要进行左规或右规处理。 ④舍入操作:在执行对阶或右规操作时常用“0”舍“1”入法将右移出去的尾数数值进行舍入,以确保精度。 ⑤判结果的正确性:即阶码是否溢出 若阶码下溢(移码表示是00…0),要置结果为机器0; 若阶码上溢(超过了阶码表示的最大值)置溢出标志。 例题:假定X=0 .0110011*211,Y=0.1101101*2-10(此处的数均为二进制)?? 计算X+Y;解:[X]浮:0 1010 1100110 [Y]浮:0 0110 1101101 符号位阶码尾数 第一步:求阶差:│ΔE│=|1010-0110|=0100 第二步:对阶:Y的阶码小,Y的尾数右移4位 [Y]浮变为0 1010 0000110 1101暂时保存 第三步:尾数相加,采用双符号位的补码运算 00 1100110 +00 0000110 00 1101100 第四步:规格化:满足规格化要求 第五步:舍入处理,采用0舍1入法处理 故最终运算结果的浮点数格式为:0 1010 1101101, 即X+Y=+0. 1101101*210

①阶码运算:阶码求和(乘法)或阶码求差(除法) 即[Ex+Ey]移= [Ex]移+ [Ey]补 [Ex-Ey]移= [Ex]移+ [-Ey]补 ②浮点数的尾数处理:浮点数中尾数乘除法运算结果要进行舍入处理 例题:X=0 .0110011*211,Y=0.1101101*2-10 求X※Y 解:[X]浮:0 1 010 ******* [Y]浮:0 0 110 1101101 第一步:阶码相加 [Ex+Ey]移=[Ex]移+[Ey]补=1 010+1 110=1 000 1 000为移码表示的0 第二步:原码尾数相乘的结果为: 0 10101101101110 第三步:规格化处理:已满足规格化要求,不需左规,尾数不变,阶码不变。第四步:舍入处理:按舍入规则,加1进行修正 所以X※Y= 0.1010111※2+000

第7章DSP定点数和浮点数(重要)

第7章D S P定点数和浮点数(重要) 本期教程主要跟大家讲解一下定点数和浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。特别是初学的一定要理解这些基础知识。 7.1 定点数和浮点数概念 7.2 IEEE浮点数 7.3 定点数运算 7.4总结 7.1定点数和浮点数概念 如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。相比之下,如果小数点的位置可变,则称为“浮点数”(定点数的本质是小数,整数只是其表现形式)。 7.1.1定点数 常用的定点数有两种表示形式:如果小数点位置约定在最低数值位的后面,则该数只能是定点整数;如果小数点位置约定在最高数值位的前面,则该数只能是定点小数。 7.1.2浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的 NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。 定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102,其中 1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。 提示: 尾数有时也称为有效数字(Significand)。尾数实际上是有效数字的非正式说法。

51单片机函数库

《MCS-51单片机实用子程序库(96年版)》 ; ; 周航慈 ; ; ; 目前已有若干版本的子程序库公开发表,它们各有特色。笔者在1988年也编制了两个 ;子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方 ;面作了一些工作。本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭 ;代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。经过八年来全国 ;广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错 ;误,成为现在这个最新版本。 ; 本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订: ; (1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库 ;的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。 ; (2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮 ;点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。 ; (3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理 ;程序的工作变得更简单直观。 ; 在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈 ;需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。程序 ;清单中开列了四个栏目:标号、指令、操作数、注释。为方便读者理解,注释尽力详细。 ; 子程序库的使用方法如下: ; 1.将子程序库全部内容链接在应用程序之后,统一编译即可。优点是简单方便,缺 ;点是程序太长,大量无关子程序也包含在其中。 ; 2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。有些子程 ;序需要调用一些低级子程序,这些低级子程序也应该包含在内。优点是程序紧凑,缺点是 ;需要对子程序库进行仔细删节。

关于浮点数与定点数的理解

定点数与浮点数 计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x 的形式为x = x0.x1x2…x n( 其中x0为符号位,x1~x n是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位x n = 1,前面各位都为0 ,则数的绝对值最小,即|x|mi n = 2-n。如果各位均为1,则数的绝对值最大,即|x|ma x =1-2-n 。所以定点小数的表示范围是: 2- n ≤ | x| ≤ 1 - 2- n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x 的形式为x = x0x1x2…x n ( 其中x0为符号位,x1~x n是尾数,x n为最低有效位),则在计算机中的表示形式为:

定点整数的表示范围是: 1≤ | x| ≤ 2n - 1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原成实际数值。若比例因子选择不当,往往会使运算结果产生溢出或降低数据的有效精度。 用定点数进行运算处理的计算机被称为定点机。 2. 浮点数表示法(floating-point number) 4与科学计数法相似,任意一个J进制数N,总可以写成 N = J E × M 式中M称为数N 的尾数(mantissa),是一个纯小数;E为数N 的阶码(e x ponent),是一个整数,J称为比例因子J E的底数。这种表示方法相当于数的小数点位置随比例因子的不同而在一定范围内可以自由浮动,所以称为浮点表示法。 底数是事先约定好的(常取2),在计算机中不出现。在机器中表示一个浮点数时,一是要给出尾数,用定点小数形式表示。尾数部分给出有效数字的位数,因而决定了浮点数的表示精度。二是要给出阶码,用整数形式表示,阶码指明

相关文档
最新文档