浮点数乘法.txt

合集下载

浮点数的乘法运算

浮点数的乘法运算
第4章
机器数的运算方法及运算器
目 录
4.1 机器数的加减运算及其实现
4.2 定点乘法及其实现
4.4 浮点数的算术运算 4.5 运算器的组成和结构
4.1 机器数的加减运算及其实现
4.1.1 原码加法 4.1.2 补码加法 4.1.3 减法运算 4.1.4 补码加减运算线路的实现
4.1.1
原码加法
解:
先比较X与Y的绝对值,本题 ∣Y∣>|X| ,所以做减法|Y∣-|X|, 结果是Z=-01101
4.1.1
以下三步运算:
原码加法
用原码进行符号不同的两个数相加时有 ① 比较两个数的绝对值的大小;
② 绝对值大的数的绝对值减去绝对值小 的数的绝对值; ③ 结果赋以绝对值大的那个数的符号。
4.1.2
(-1<X+Y<0),求这两数之和。
解:[X]补=1.0011 [Y]补=0.0111 [X]补+[Y]补=1.0011+0.0111=1.1010 [X+Y]原=[[X]补+[Y]补]补=[1.1010]补=1.0110 所以,X+Y=-0.0110 用真值进行运算:X+Y=-0.1101+0.0111=-0.0110 结果相同。
用补码的加法求Z=X+Y 解:[X]补=1.01001,[Y]补=0.10001 [X+Y]补= [X]补+[Y]补=1.01001+0.10001 =1.11010
[[X+Y]补]补=1.00110
Z=X+Y=-0.00110
所以,Z=-0.00110,没有发生溢出,结果也是正确的。
2.变形补码加法
补码加法

第5讲_浮点数四则运算

第5讲_浮点数四则运算

解: ∵
214 = 16384
215 = 32768
∴ 15 位二进制数可反映 ±3 万之间的十进制数 215 × 0.××× … … ××
15位
m = 4、5、6 …
满足 最大精度 可取 m = 4,n = 18
3、举例
19 例 将 + 128 写成二进制定点数、浮点数及在定点 机和浮点机中的机器数形式。其中数值部分均取 10 位, 数符取 1 位,浮点数阶码取 5 位(含1位阶符)。
机器中数据的数值范围与精度
数值范围:机器能表示的一个数的最大值与 最小值之间的范围。 数据精度:由尾数的位数决定,尾数位数越 多,可表示精度越高。
浮点数的表示范围
上溢 阶码 > 最大阶玛 下溢 阶码 < 最小阶码 按 机器零 处理 上溢 上溢
负数区
最小负数 m –2( 2 –1)×( 1 – 2–n)
第5 讲 浮点数四则运算
定点数和浮点数 浮点数的加减运算
浮点数的乘除运算
一、定点数和浮点数
小数点按约定方式标出 1、定点数
S f S 1S 2 … n S
数 数值部分 符 小数点位置

Sf S1S2 … n S
数 符
数值部分
小数点位置
定点机 原码
小数定点机 –(1 – 2-n) ~ +(1 – 2-n)
解: 设 x = +
二进制形式 定点表示
19 128
x = 0.0010011 x = 0.0010011 000 浮点规格化形式 x = 0.1001100000×2-10 [x]原 = [x]补 = [x]反 = 0.0010011000 定点机中
浮点机中 [x]原 = 1, 0010; 0. 1001100000 [x]补 = 1, 1110; 0. 1001100000 [x]反 = 1, 1101; 0. 1001100000

浮点数的运算方法

浮点数的运算方法

浮点数的运算方法浮点数是计算机中用于表示实数的一种数据类型,由于实数是无限的,而计算机只能存储有限的信息,所以必然存在精度误差。

浮点数的运算涉及到加法、减法、乘法和除法等基本运算,以及开方、幂函数等高级运算。

1.加法运算:浮点数相加时,先将较小的浮点数调整为与较大的浮点数相同的指数,然后进行尾数的相加,最后对结果进行规格化处理,即进行舍入操作,得到最终的结果。

2.减法运算:浮点数相减的原理与加法相同,只是在相减之前,需要将两个浮点数的指数调整为相等,然后进行尾数的相减操作,最后同样需要对结果进行规格化处理。

3.乘法运算:浮点数相乘时,将两个浮点数的指数相加,然后将尾数相乘得到结果的尾数部分,最后对结果进行规格化处理。

4.除法运算:浮点数除法的原理与乘法类似,先将两个浮点数的指数相减,然后将尾数相除得到结果的尾数部分,最后同样需要进行规格化处理。

5.开方运算:浮点数的开方运算是通过求解多项式的根来实现的,常用的方法有牛顿法、二分法和二次近似法等。

这些方法都是通过迭代的方式,逐步逼近平方根的值,直到达到所需的精度。

6.幂函数运算:浮点数的幂函数运算可以通过连乘或连乘的方式实现。

幂函数运算的精度取决于底数和指数的精度以及所需的结果精度。

在浮点数的运算过程中,需要注意以下几个常见问题:1.精度丢失:浮点数的表示是有限的,不可避免地存在精度误差,特别是在进行连续的浮点数运算时,会导致误差累积,可能导致结果的不准确。

2.舍入误差:浮点数的结果需要进行舍入操作以保持一定的精度。

舍入规则有多种,如四舍五入、向上取整、向下取整等,选择合适的舍入规则可以减小误差。

3.溢出和下溢:浮点数的范围是有限的,当计算结果超出范围时,会发生溢出;当结果接近零但无法表示时,会发生下溢。

这两种情况都需要进行特殊处理。

4. 特殊数值:浮点数中有几个特殊的数值,如无穷大(Infinity)、非数值(NaN)和零(0)。

这些特殊值的运算需要按照特定的规则进行处理,以免引起错误。

浮点数的四则运算

浮点数的四则运算
例 已知 [Ex]移=00110,[Ey]移=11011,求[Ex+Ey]移。 解:因为[Ex]移 + [Ey]移 = 00110+11011=00001 将符号位取反得:[Ex+Ey]移=10001
8
由于补码和移码的数值位相同,符号位相反,因 此可以将移码和补码混合使用,即利用X的移码和Y的 补码之和来表示X+Y的移码。
移码加减运算的溢出判断方法是: Sf1 Sf2=00,结果为负,无溢出; Sf1 Sf2=01,结果为正,无溢出; Sf1 Sf2=10,结果上溢; Sf1 Sf2=11,结果下溢;
10
例 设不含阶符的阶码位数n=4,Ex=-1010,Ey=+ 0111,求[Ex±Ey]移。
解: [Ex]移 =000110,[Ey]补 =000111, [-Ey]补 =111001
2
浮点加减运算(续)
右规和对阶操作时尾数右移,需要进行舍入处理。 计算机中的舍入方法: ❖ 截断法:
将移出的数据一律舍去。该方法简单,但影响精度;
❖ 0舍1入法:
移掉的是1,则尾数末位加1,移掉的是0,则不加。
❖ 末位恒置1法:
将欲保留的末位数据恒置1,无论右移掉的是1还是0,也 无论此时末位是1还是0。
[Ex+ Ey ]移=[Ex]移 + [Ey]补 =000110+000111= 001101,Ex+ Ey=-0011;
[Ex- Ey ]移=[Ex]移 + [-Ey]补 =000110+111001= 111111,结果出现下溢出.
11
2.7.2 浮点乘除运算
一、浮点乘法运算 设两个浮点数为:X=Mx·2Ex,Y=My·2Ey 则:X·Y=(Mx·My)·2(Ex+Ey) 浮点乘法运算的步骤: 1.乘数判0,若有一乘数为0 ,则积为0,无需运算; 2.阶码相加并判溢出;

浮点数乘除法

浮点数乘除法

主页技术‎资源库学‎习下载‎支持社区‎登录‎| Col‎o mbia‎- Es‎p a?ol‎| 首选‎项‎‎MSD‎N Lib‎r ary ‎技术文章‎V isua‎l Stu‎d io 2‎003‎M icro‎s oft ‎V isua‎l C++‎浮点优化‎‎Micr‎o soft‎Visu‎a l C+‎+浮点优‎化Vi‎s ual ‎S tudi‎o .NE‎T 200‎3发布日‎期 : 7‎/8/20‎04 | ‎更新日期‎: 7/8‎/2004‎Eric‎Flee‎g al‎M icro‎s oft ‎C orpo‎r atio‎n适用‎于:Mic‎r osof‎t Vis‎u al C‎++摘‎要:了解如‎何使用 M‎i cros‎o ft V‎i sual‎C++ ‎2005(‎以前称为‎V isua‎l C++‎―Whid‎b ey‖)‎的浮点语义‎管理方法来‎优化浮点代‎码。

创建快‎速程序,同‎时确保仅对‎浮点代码执‎行安全优化‎。

本页‎内容C‎++ 中的‎浮点代码优‎化浮‎点语义的‎f p:pr‎e cise‎模式‎浮点语义‎的 fp:‎f ast ‎模式‎浮点语义的‎fp:s‎t rict‎模式‎fenv‎_acce‎s s 杂注‎fp‎_cont‎r act ‎杂注‎f loat‎_cont‎r ol 杂‎注启‎用浮点异常‎语义‎相关书籍‎C+‎+中的浮‎点代码优化‎C++ ‎优化编译器‎不仅能够将‎源代码转换‎为机器码,‎而且能够对‎机器指令进‎行适当的排‎列以便改善‎性能和/‎或减小大小‎。

遗憾的是‎,许多常用‎的优化在应‎用于浮点计‎算时未必安‎全。

在下面‎的求和算法‎[1] ‎中,可以看‎到这方面的‎一个恰当的‎示例:‎f loat‎Kaha‎n Sum(‎cons‎t flo‎a t A[‎], in‎t n )‎{‎f‎l oat ‎s um=0‎, C=0‎, Y, ‎T;‎for ‎(int ‎i=0; ‎i<n; ‎i++)‎ {‎‎Y = ‎A[i] ‎- C;‎‎T = ‎s um +‎Y;‎‎C = T‎- su‎m - Y‎;‎ su‎m = T‎;‎}‎r etur‎n sum‎;}该‎函数将数组‎向量 A ‎中的 n ‎个浮点值相‎加。

vivado双精度浮点数乘法计算

vivado双精度浮点数乘法计算

vivado双精度浮点数乘法计算Vivado is a software tool developed by Xilinx for designing and programming FPGAs (Field Programmable Gate Arrays) and SoCs (System on Chips). One of the key features of Vivado is its support for double-precision floating-point arithmetic, which allows for high-precision calculations in FPGA designs. Double-precision floating-point numbers are numbers that can represent a wide range of values with high precision, making them ideal for scientific and engineering calculations.When it comes to double-precision floating-point multiplication in Vivado, there are a few key considerations to keep in mind. First and foremost, it's important to understand the format of double-precision floating-point numbers. In the IEEE 754 standard, double-precision floating-point numbers are represented using 64 bits, with 1 bit for the sign, 11 bits for the exponent, and 52 bits for the significand. This format allows for a wide range of values to be represented with high precision,but it also introduces some complexity when it comes to multiplication.In Vivado, double-precision floating-point multiplication is typically implemented using dedicated hardware resources within the FPGA. These resources include dedicated multipliers and adders that are specifically designed to handle double-precision floating-point arithmetic. By leveraging these dedicated resources, Vivado is able to perform double-precision floating-point multiplication with high efficiency and low latency, making it well-suited for a wide range of applications.In addition to dedicated hardware resources, Vivado also provides a range of optimization options for double-precision floating-point multiplication. These options allow designers to fine-tune the performance and resource utilization of the multiplication operation, ensuring that it meets the specific requirements of their design. By carefully selecting the appropriate optimization options, designers can maximize the performance of double-precision floating-point multiplication while minimizing the use ofFPGA resources.Another key consideration when it comes to double-precision floating-point multiplication in Vivado is the impact on overall system performance. While double-precision floating-point multiplication can provide high precision and accuracy, it also requires a significant amount of computational resources. This can impact the overall performance of the FPGA or SoC, particularly in designs with tight timing constraints or limited resources. To address this, designers must carefully balance the need for high precision with the available resources and performance requirements of their design.Overall, double-precision floating-point multiplication in Vivado offers a powerful and flexible solution for high-precision arithmetic in FPGA and SoC designs. By leveraging dedicated hardware resources, optimization options, and careful consideration of overall system performance, designers can effectively implement double-precision floating-point multiplication to meet the specific requirements of their design. With its support for high-precision calculations, Vivado continues to be a valuable tool for a wide range of scientific, engineering, and computational applications.。

c51 浮点数 乘法

c51 浮点数 乘法

c51 浮点数乘法
C51浮点数乘法指C语言中基于C51单片机的浮点数乘法运算。

浮点数乘法是一种数学运算,用于计算两个浮点数的乘积。

在C51中,浮点数乘法操作可以使用相应的浮点数运算指令。

通过这些指令,我们可以将两个浮点数作为操作数,并将结果存储在相应的寄存器中。

浮点数乘法操作的过程是将两个浮点数的阶码、尾数和符号进行计算,并将结果保存在一个新的浮点数中。

具体的实现细节取决于C51单片机的架构和具体的编程语言。

浮点数乘法操作在许多计算任务中都非常常见。

在科学计算、物理模拟、图形处理等领域,浮点数乘法操作经常用于对实数进行精确的计算。

总之,C51浮点数乘法是一种用于计算两个浮点数乘积的数学运算,可以通过相应的指令在C51单片机上实现。

它在许多领域中都有广泛的应用。

第03章 3.5 浮点数的运算方法

第03章 3.5 浮点数的运算方法
12/17 12
移码运算:
[X+Y]移=[X]移+[Y]补 [X-Y]移=[X]移+[-Y]补 双符号位: 00 ~ 负数,无溢出 01 ~ 正数,无溢出 10 ~ 上溢 11 ~ 下溢 溢出条件:最高符号位为1
13/17 13
例如:已知 X=2010· 0.11011011, Y=2100· (-0.10101100) ,求X+Y。 (同上题,但改为阶用移码) 解: (1) 对阶 阶差ΔE=[EX]移+[-EY]补 =01010+11100=00110 (-2) X阶码小,MX右移2位,阶码取100。
(4) 舍入(0舍1入)
附加位最高位为1,在结果的最低位+1,得新结果: [M]补=11.00010110, M=-0.11101010。
(5) 判溢出
阶码移码符号位为01,故不溢出,最终结果为: X+Y=2011· (-0.11101010) 。
15/17 15
二、浮点数的乘法运算
X×Y=(MX×MY)· 2EX+EY
[MX]补=00 .00 110 110 11
下划线上的数是右移出去而保留的附加位。
14/17 14
(2) 尾数相加
[MX]补+[MY]补 =00.0011011011+11.01010100=11.10001010 11
(3) 规格化操作
左规,移1位,结果=11.00010101 10; 阶码-1,E=01100+11111=01011。(+3)
(1) 检测操作数是否为0,并置结果数符( ).
(2) 加阶:两数阶码相加,得积的阶码。 (3) 两数的尾数做定点乘法,得积的尾数。 (4) 否溢出。 (阶码运算、尾数规格化时都可能溢出)

浮点四则运算

浮点四则运算
– 溢出的条件是运算结果移码的最高符号位为1。此时若 低位符号位为0,表示上溢;低位符号位为1,表示下 溢。 – 如果运算结果移码的最高符号位为0,即表明没溢出。 此时若低位符号位为1,表明结果为正:低位符号位为 0,表示结果为负。
阶码运算
• 溢出判断举例: • 设阶码取三位(不含符号位), 当jx=+101,jy=+110时,有 [jx]移=01,101, [jy]补=00,110 则: [jx +jy]移=[jx]移+ [jy]补=01,101+00,110=10,001 结 果上溢 [jx -jy]移=[jx]移+ [-jy]补=01,101+11,100=01,001 结果+1
4. 舍入—常用的舍入方法
• “0舍1入”法:“0舍1入”法类似于十进制运算 中的“四舍五入”法,即在尾数右移时,被移去 的最高数值位为0,则舍去;被移去的最高数值位 为1,则在尾数的末位加1。这样做可能使尾数又 溢出,此时需再做一次右规。
– 特点:最大误差是最低位上的-1/2到接近于1/2之间, 正误差可以和负误差抵消。属于比较理想的方法,但 实现起来比较复杂。
3. 规格化
• 尾数S的规格化是指尾数满足条件:


如果采用双符号位的补码,则 当S>0时,其补码规格化形式为 [S]补=00.1××…× 当S<0时,其补码规格化形式为 [S]补=11.0××…× 但对S<0时,有两种情况需特殊处理。
① ② S=-1/2,则[S]补=11.100…0。对于补码而言,它不满足于上面 的规格化表示式。为了便于硬件判断,特规定-1/2是规格化的 数(对补码而言)。 S=-1,则[S]补=11.000…0。因小数补码允许表示-1,故-1视为 规格化的数。

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

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

设两个浮点数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 000011000 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 0001 000为移码表示的0第二步:原码尾数相乘的结果为:0 10101101101110第三步:规格化处理:已满足规格化要求,不需左规,尾数不变,阶码不变。

浮点乘法与除法的运算

浮点乘法与除法的运算

浮点乘法与除法的运算1.浮点乘法、除法运算规则设有两个浮点数x和y:x=2Ex·Mxy=2Ey·My浮点乘法运算的规则是x×y=2(Ex+Ey)·(M×My)(2.40)x即乘积的尾数是相乘两数的尾数之积,乘积的阶码是相乘两数的阶码之和。

当然,这里也有规格化与舍入等步骤。

浮点除法运算的规则是x÷y=2(Ex-Ey)·(M÷My)(2.41)x商的尾数是相除两数的尾数之商,商的阶码是相除两数的阶码之差。

也有规格化和舍入等步骤。

2.浮点乘、除法运算步骤浮点数的乘除运算大体分为四步:第一步,0 操作数检查;第二步,阶码加/减操作;第三步,尾数乘/除操作;第四步,结果规格化及舍入处理。

(1) 浮点数的阶码运算对阶码的运算有+1、-1、两阶码求和、两阶码求差四种,运算时还必须检查结果是否溢出。

在计算机中,阶码通常用补码或移码形式表示。

补码运算规则和判定溢出的方法,前面已经讲过。

这里只对移码的运算规则和判定溢出的方法进行讲解。

移码的定义为[x]移=2n+x2n>x≥-2n按此定义,则有[x]移+[y]移=2n+x+2n+y=2n+(2n+(x+y))=2n+[x+y]移即直接用移码实现求阶码之和时,结果的最高位多加了个1,要得到正确的移码形式结果,必须对结果的符号再执行一次求反。

当混合使用移码和补码时,考虑到移码和补码的关系:对同一个数值,其数值位完全相同,而符号位正好完全相反。

而[y]补的定义为[y]补=2n+1+y则求阶码和用如下方式完成:[x]移+[y]补=2n+x+2n+1+y=2n+1+(2n+(x+y))即[x+y]移=[x]移+[y]补(mod 2n+1)(2.42)同理[x-y]移=[x]移+[-y]补(2.43)上二式表明执行阶码加减时,对加数或减数y来说,应送移码符号位正常值的反码。

如果阶码运算的结果溢出,上述条件则不成立。

浮点乘法精度

浮点乘法精度

浮点乘法精度浮点乘法精度是指在计算机中进行浮点数乘法运算时所能达到的精确度。

由于计算机采用二进制表示浮点数,而浮点数的范围和精度有限,因此在进行浮点数乘法运算时可能会出现精度丢失的情况。

浮点乘法精度的问题主要源于浮点数的表示方式。

在计算机中,浮点数通常采用IEEE 754标准进行表示。

这种表示方法将浮点数分为三个部分:符号位、指数位和尾数位。

其中,指数位表示浮点数的大小,尾数位表示浮点数的精度。

由于尾数位的位数是有限的,因此计算机在进行浮点数乘法运算时可能无法保证完全精确。

浮点乘法精度问题的一个常见表现是舍入误差。

舍入误差是指由于浮点数的表示精度有限导致的计算结果与实际结果之间的差异。

例如,当计算机进行浮点数乘法运算时,可能会将结果四舍五入到最接近的有效数字,从而导致结果的精度降低。

为了解决浮点乘法精度问题,可以采取一些措施。

首先,可以尽量避免进行连续的浮点数乘法运算,而是将其拆分为多个步骤,每个步骤只进行一次乘法运算。

这样可以减小舍入误差的累积效应,提高运算结果的精度。

可以采用更高精度的数据类型来表示浮点数。

例如,可以使用双精度浮点数(double)而不是单精度浮点数(float)来进行计算。

双精度浮点数的尾数位更长,因此具有更高的精度。

当然,这样做会增加存储空间和计算时间的开销,因此需要根据具体情况进行权衡。

还可以使用一些数值计算库来提高浮点乘法的精度。

这些库通常实现了更高精度的浮点数表示和计算方法,可以更准确地进行乘法运算。

例如,可以使用GNU科学计算库(GSL)或Python的NumPy库来进行高精度的浮点数计算。

在实际应用中,浮点乘法精度问题可能会导致一些严重的后果。

例如,在金融领域的计算中,由于精度丢失导致的计算错误可能会带来巨大的损失。

因此,在进行浮点数乘法运算时,需要特别注意精度问题,并根据具体情况选择合适的计算方法和数据类型。

总的来说,浮点乘法精度是计算机中一个常见的问题。

由于浮点数的表示精度有限,计算机在进行浮点数乘法运算时可能会出现精度丢失的情况。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
je kout;
cmp al,13; ///回车
je kout;
cmp al,'-';
jne nextb1;
inc [sign];
jmp errorb;
nextb1:
cmp al,'.';
jne nextb2;
jmp errorb;
;///浮点数a调整为整数
kout:
mov bl,[ca];
cmp bl,0;
je a_over;
a_again:
mov dx,[aint];
mov cl,3;
shl dx,cl;
shl [aint],1;
mov bx,1000;
jmp int_num_over;
d2:
cmp [aint],100;
jb d1
mov dl,3;
mov bx,100;
jmp int_num_over;
d1:
cmp [aint],10;
inc [dotb];
call errorb;
nextb2:
cmp al,'0'
jb errorb;
cmp al,'9';
ja errorb;
and ah,00h;
sub ax,48;
cmp [dotb],0;
add dl,[ca];
add dl,[cb];
mov [ca],dl;
mov bx,1;
dec dl;
auto2:
mov ax,bx;
mov cl,3;
shl ax,cl;
shl bx,1;
add bx,ax;
;//////由整数调整为小数
mov bx,1;
mov dl,0;
add dl,[ca];
add dl,[cb];
cmp dl,0;
je l_over;
l_again:
mov ax,bx;
mov cl,3;
cmp al,13; ///回车
je inputb;
cmp al,'-'; /判断正负符号
jne nexta1;
inc [sign];
jmp errora;
nexta1:
cmp al,'.'; /判断小数点
jne nexta2;
start:
mov ax,data_seg
mov ds,ax
mov es,ax
errora:
mov ah,01h; //输入一个字符
int 21h;
cmp al,32; /// 空格
je inputb;
mov dx,0;
mov ax,[aint];
div bx;
push ax;
push dx;
int_over:
add al,48;
mov dl,al
mov ah,02h;
int பைடு நூலகம்1h;
jb d0
mov dl,2
mov bx,10;
d0:mov dl,1
int_num_over:
mov [act],dl; //确定整 //数的位数
mov cl,[act];
shift1:
mov bx,1;
cmp [aint],10000;
jb d3;
mov dl,5;
mov bx,10000;
jmp int_num_over;
d3:
cmp [aint],1000;
jb d2;
mov dl,4;
int 21h;
mov dx,0;
mov ax,bx;
mov bx,10;
div bx;
mov bx,ax
pop dx;
mov [aflt],dx;
dec cl;
jnz shift2;
all_dis_over:
mov ax,4c00h
int 21h
jnz shift1;
;//小数点的显示
cmp [aflt],0;
je all_dis_over;
//小数部分为0,显示结束
mov dl,46;
mov ah,02h;
int 21h;
;//小数部分
mov dl,0;
dota db 0;//数a的小数点标志值位
ca db 0; //数a的小数位个数位
dotb db 0; //数b的小数点标志值位
cb db 0; //数b的小数位个数位
sign db 0; //数a、b的符号个之和
segment code_seg
je intb;
inc [cb];
mov bx,[bflt];
mov dx,bx;
mov cl,3;
shl dx,cl;
shl bx,1;
add bx,dx;
add bx,ax;
mov [bflt],bx;
format MZ
entry code_seg:start;
stack 256
segment data_seg
act db 0;
aint dw 0;//数a的整数部分
aflt dw 0;//数a的小数部分
bint dw 0;//数b的整数部分
bflt dw 0;//数b的小数部分
;///ASCII码转换及显示部分
;///符号部分
cmp [sign],1; //符号三种可能:0、1、2
jne sign_over
mov dl,45; //‘-’
mov ah,02h;
int 21h;
;//整数部分的显示
sign_over:
je inta;
inc [ca];//是小数部分,则输入一位,标志位加1,记录小数位数
mov bx,[aflt]; 小数的存储
mov dx,bx;
mov cl,3;
shl dx,cl;
shl bx,1;
add bx,dx;
add [aint],dx; //数a放大十倍
dec bl;
jnz a_again;
a_over:
mov ax,[aint];
add ax,[aflt];
mov [aint],ax;
;//////// 浮点数b调整为整数
mov bl,[cb];
dec dl ;
jnz auto2;
mov cl,[ca];
shift2:
mov dx,0;
mov ax,[aflt];
div bx;
push dx;
add al,48;
mov dl,al
mov ah,02h;
add bx,dx;
add bx,ax;
mov [aint],bx;
jmp errora;
;////数字b的输入
inputb:
errorb:
mov ah,01h;
int 21h;
cmp al,32; /// 空格
pop dx;
pop ax;
mov ax,dx;
mov [aint],ax;
dec cl;
mov dx,0;
mov ax,bx;
mov bx,10;
div bx;
mov bx,ax;
shl bx,cl;
shl ax,1;
add bx,ax;
dec dl;
jnz l_again;
l_over:
pop dx;
pop ax;
div bx;
mov [aint],ax; //整数部分
mov [aflt],dx; //小数部分
inc [dota];
jmp errora;
nexta2:
cmp al,'0'; /判断是否在0-9
jb errora;
cmp al,'9';
ja errora;
and ah,00h;
sub ax,48;
cmp [dota],00h; //以小数点为标志判断是整数部分还是小数部分
add bx,ax;
mov [aflt],bx;
jmp errora;
inta:
mov bx,[aint]; 整数的存储
mov dx,bx;
mov cl,3;
shl dx,cl;
shl bx,1;
jmp errorb;
intb:
mov bx,[bint];
mov dx,bx;
mov cl,3;
shl dx,cl;
shl bx,1;
add bx,dx;
add bx,ax;
mov [bint],bx;
cmp bl,0;
je b_over;
b_again:
mov dx,[bint];
mov cl,3;
shl dx,cl;
shl [bint],1;
add [bint],dx;
dec bl;
jnz b_again;
b_over:
mov ax,[bint];
相关文档
最新文档