首页 > 编程知识 正文

java定义小数位数的方法,java小数点右移后去0

时间:2023-05-04 10:35:31 阅读:257417 作者:1561

转换程序

实际应用中经常遇到数制和码制的转换问题,如十进制数(BCD码)与二进制数、ASCII码与二进制数之间的相互转换等。

例:将内部RAM 30H中1字节压缩BCD表示的十进制数转换为二进制数,并存入内部RAM的20H中。

1)题目分析

1字节压缩BCD表示的十进制数的范围是0~99,用十六进制表示为00H~63H,转换后仍为单子节。可以采用以下两种算法实现。

2)参考程序

方法1:十位×10+个位

MOV   A,30H       ;取压缩BCD

SWAP  A

ANL   A,#0FH      ;处理压缩BCD高4位

MOV   B,#10

MUL   AB          ;BCD高4位×10

ANL   30H,#0FH    ;取压缩BCD低4位

ADD   A,30H

MOV   20H,A       ;存结果

SJMP  $

方法2:模仿十进制数转换二进制数的手算过程。采用除2取余法,二进制除2,只要右移一位,但BCD数转二进制数需要进行修正。当十位BCD数右移一位,若移入个位的数是0,则商一定是BCD数;若移入个位的数数1,则需要进行修正。因为十位除以2,到个位应为5,但在BCD数它却是8,两者相差3,因此需要进行减3调整。

MOV   20H,#0      ;余数单元清0

MOV   A,30H       ;取数

MOV   R2,#8       ;8位余数

BCD1: CLR   C

RRC   A           ;BCD数除以2

XCH   A,20H       ;将余数移入20H单元

RRC   A

XCH   A,20H

JNB   ACC.3.BCD2  ;判别高位除以2移入低位,为1则减3修正

CLR   C

SUBB  A,#3

BCD2: DJNZ  R2,BCD1     ;判断移位8位是否结束

MOV   20H,A       ;存结果

SJMP  $

例:将ASCII码转换为二进制数

1)题目分析

从ASCII编码表可知,若4位二进制数小于10,则此二进制数加上30H即变为相应的ASCII码。若4位二进制数大于等于10,则应加上37H。

2)硬件资源分配

入口参数:R2:存转换前ASCII码

出口参数:R2:存转换后的二进制数

3)参考程序

ORG   1000H

L1:   MOV   A,R2

CLR   C

SUBB  A,#30H      ;ASCII码减30H

MOV   R2,A

SUBB  A,#0AH

JC    LOOP        ;该数小于10则返回主程序

MOV   A,R2

SUBB  A,#07H

MOV   R2,A

LOOP: RET

7.5.3 定点数运算程序

定点数就是小数点固定的数,它包括整数、小数和混合小数等。另外,按数的正负可分为无符号数和带符号数,对于有符号数有原码、补码和反码等几种表示方法。

1)双字节数取补子程序

例:将(R4、R5)中的双字节数取补结果送R4、R5

参考程序:

CMPT: MOV  A,R5

CPL  A

ADD  A,#1

MOV  R5,A

MOV  A,R4

CPL  A

ADDC A,#0

MOV  R4,A

RET

2)双字节无符号数加减程序

补码表示的数可以直接相加,所以双字节无符号数加减程序也适用于补码的加减法。利用MCS51的加法和减法指令可以直接写出加减法的程序。

例:将(R2)(R3)和(R6)(R7)两个双字节无符号数相加,结果送R4、R5。

参考程序:

NADD:MOV  A,R3

ADD  A,R7

MOV  R5,A

MOV  A,R2

ADDC A,R6

MOV  R4,A

RET

例:将(R2)(R3)和(R6)(R7)两个双字节数相减,结果送R4、R5。

参考程序:

NSUB1:MOV  A,R3

CLR  C

SUBB A,R7

MOV  R5,A

MOV  A,R2

SUBB A,R6

MOV  R4,A

RET

3)原码加减运算程序

对于原码表示的数(有符号数),不能直接执行加减运算,必须先按操作数的符号决定运算种类,然后再对数值部分执行操作。

对原码表示的数进行加法运算,首先应判断两个数的符号位是否相同:

◆若相同,则执行加法(注意:这时运算只对数值部分进行,不包括符号位),加法结果有溢出时,则最终结果溢出;加法结果无溢出时,则最终结果无溢出;并以被加数或加数符号作为结果的符号位。

◆如果两个数的符号位不相同,则执行减法(注意:这时运算只对数值部分进行,不包括符号位)。如果相减的差数为正,则该差数即为最后结果,并以被加数的符号位作为结果的符号位;如果相减的差数为负,则应对差数取补,而把加数的符号位作为结果的符号位。

对原码表示的数减法运算,只需先把减数的符号位取反,然后执行加法运算。设被加数(或被减数)为A,它的符号位为A0,数值为A*,加数(或减数)为B,它的符号位为B0,数值位为B*。A、B均为原码表示的数,则按上述的算法可得出图7-7的原码加减运算框图。

图7-7 原码加减运算程序流程图

4)无符号二进制数乘法程序

模拟手算乘法的方法,可以用重复的加法来实现乘法。当被乘数和乘数有相同的字长时,它们的积为双字长,乘法的运算过程如下:

◆清“0”部分积。

◆从最低位开始检查各个乘数位。

◆如乘数位为1,加被乘数至部分积;否则不加。

◆左移1位被乘数。

◆步骤(2)~(4)重复n次(n为字长)。

实际用程序实现这一算法时,把结果单元与乘数联合组成一个双倍位字,左移被乘数改用右移结果与乘数,这样一方面可以简化加法;另一方面可用右移来完成乘数最低位的检查,得到的乘积为双倍位字。

例:将(R2R3)和(R6R7)两个双字节无符号数相乘,结果送R4R5R6R7。根据图7-8(a)的算法,可以得到如图7-8(b)所示的双字节乘法程序框图。

(a)                                (b)

图7-8 无符号双字节二进制数乘法程序框图

5)原码有符号乘法程序

对原码表示的带符号的二进制数乘法,只需要在乘法之前,先按同符号为正、异号得负的原则,得出积的符号,然后清“0”符号位;执行无符号乘法,最后送积的符号。

6)无符号二进制数除法程序

除法也可以采用类似于人工手算除法的方法。首先对被除数高位和除数进行比较,如果被除数高位大于除数,则商位为1,并从被除数减去除数,形成一个部分余数;如果被除数高位小于除数,商位为0不执行减法。接着把部分余数左移1位,并与除数再次进行比较。如此循环直至被除数的所有位都处理完为止。一般商如果为n位,则需循环n次。这种除法先比较被除数和除数的大小,根据比较结果确定上商1或0,并且上商1时才执行减法,我们称之为比较除法。

一般情况下,如果除数和商均为双字节,则被除数为4个字节。如果被除数的高两个字节大于或等于除数,则发生溢出,即商不能用双字节表示。所以,在除法之前先检验是否会发生溢出,如果溢出则置溢出标志不执行除法。

例:将(R2、R3、R4、R5)和(R6、R7)中两个无符号数相除,结果商送R4、R5,余数送R2、R3。

(a)                                                                                     (b)

图7-9 无符号双字节除法程序框图

7)原码表示的有符号双字节除法程序

原码除法与原码乘法一样,只要在除法之前,先计算商的符号(同号为正,异号为负),然后清“0”符号位,执行不带符号的除法,最后送商的符号。

7.5.4 浮点数运算程序

(1)浮点数的表示

1)二进制浮点数操作

用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。当尾数的最高位为1时,便称为规格化浮点数,简称操作数

2)十进制浮点数操作

用三个字节表示,第一个字节的最高位为数符,用来表示正负数(0表示正数,1表示负数)其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示。当十进制数的绝对值大于1时,阶码就等于整数部分的位数。

例如:156.6  的阶码是03H,-156.6 的阶码是  83H ;

当十进制数的绝对值小于 1 时,阶码就等于  80H  减去小数点后面零的个数。

例如 :0.00362的阶码是 7EH ,-0.00362 的阶码是  0FEH 。

例如:有一个十进制浮点操作数存放在30H、31H、32H中,数值是-0.07315,即-0.7315 乘以10 的-1 次方,则阶码为7FH,若加上数符(30H)=0FFH,31H=73H,(32H)=15H 。

3)运算精度

单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于十万分之三;单次二进制浮点超越函数运算的精度优于万分之一;BCD码浮点数本身的精度比较低(万分之一到千分之一),不宜作为运算的操作数,仅用于输入或输出时的数制转换。不管那种数据格式,随着连续运算的次数增加,精度都会下降。

(2)浮点数加减法子程序

执行加减法前,必须先对准小数点,然后才能按定点小数加减法操作。当两个浮点数阶码相等时,它们的尾数可以相加。如果阶码不相等,首先要对阶,使小数点对齐,才能进行加减操作。由于结果不一定为规格化的数,因此必须在运算结束后进行规格化操作。

如果运算结果的尾数m>1,则应将尾数右移一位,阶码加1,称为右规格化;当尾数<1/2,应将尾数左移一位,阶码减1,称为左规格化。

例:3字节浮点数通用规格化子程序

1)题目分析  子程序功能为:

CY=0 执行右规格化

CY=1 执行左规格化

F0=0  对浮点数1:R3(阶)R7、R6(尾)进行右移一位

F0=1  对浮点数2:R2(阶)R5、R4(尾)进行右移一位

2)硬件资源分配

R7、R6:浮点数1的尾数,R3:浮点数1的阶

R5、R4:浮点数2的尾数,R2:浮点数2的阶

39H:右移输入位

3)程序流程图如图7-10所示

图7-10 浮点数规格化子程序流程图

例:将R3、R7、R6和R2、R5、R4中的两个三字节数相加或相减,结果送R5、R7、R6。如果入口时位地址3AH=0,则执行加法;如果3AH=1,则执行减法。执行加减运算时要先对阶,采用小阶向大阶靠的方法。

1)题目分析

两个异号数相加,相当于两个同号数相减;两个异号数相减,相当于两个同号数相加。

2)硬件资源分配

R7、R6:浮点数1的尾数,R3:浮点数1的阶

R5、R4:浮点数2的尾数,R2:浮点数2的阶

38H:存被加数符号,39H:运算溢出标志,3AH:加减标志位

3)程序流程图如图7-11所示

图7-11 浮点数加减运算子程序流程图

(3)浮点数乘法子程序

执行浮点数乘法比加减法方便,不需要对准小数点,只要将阶码相加,尾数相乘即可。设浮点数1的尾数为m1,浮点数2的尾数为m2,对于两个规格化浮点数,尾数相乘,0.25≤m1m2<1,不会产生溢出,但可能需进行左规格化。

例:浮点数乘法子程序

1)题目分析

3字节浮点数N1、N2相乘。N1×N2->R3(阶)R7、R6(尾数);2字节尾数相乘,结果为4字节。调用2字节无符号数乘法子程序。用规格化3字节浮点数表示乘积,要舍去2字节。结果4舍5入处理。

2)硬件资源分配

R7、R6:浮点数1的尾数,R3浮点数1的阶

R5、R4:浮点数2的尾数,R2浮点数2的阶

38H:存积符号

3)程序流程图如图7-12所示

图7-12 浮点数乘法子程序流程图

(4)浮点数除法子程序

执行浮点数除法与浮点数乘法不同,不能对尾数直接调用双字节定点小数除法子程序。因为浮点数除法在入口时,应满足被除数小于除数的条件,否则商将大于1,无法用小数表示。所以执行浮点除法时,要先调整小数点的位置(即调整阶码),使被除数的尾数m1小于除数的尾数m2。

执行浮点数除法应先调整被除数的尾数,使m1<m2,然后阶码相减,尾数相除。结果不需要进行规格化。

例:浮点除法子程序

1)题目分析

已知3字节浮点数N1和N2。N1/N2->R3(阶)R7、R6(尾数)。先判断是否满足m1<m2的条件。如满足条件,则直接调用2字节除法子程序,如不满足条件,则浮点数N1先执行右规格化,然后再调用2字节除法子程序。

2)硬件资源分配

R7、R6:浮点数1的尾数,R3浮点数1的阶

R5、R4:浮点数2的尾数,R2浮点数2的阶

38H:存积符号

3)程序流程图如图7-13所示。

?????????????????

◆◆

评论读取中....

请登录后再发表评论!

◆◆

修改失败,请稍后尝试

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。