浮点加法、减法, 乘法、除法运算
浮点加法、减法运算
1.运算步骤
假设浮点数的阶码和尾数均用补码表示,在浮点加减运算时,为便于浮点数尾数的规格化处理和浮点数的溢出判断,阶码和尾数均采用双符号位表示。
①对阶,小阶向大阶对齐
两个浮点数进行加减运算时,首先要使两个数的阶码相同,即小数点的位置对齐。若两个数的阶码相同,表示小数点的位置是对齐的,就可以对尾数进行加减运算。反之,若两个数的阶码不相同,表示小数点的位置没有对齐,此时必须使两个数的阶码相同,这个过程称为对阶。
要对阶,首先应求出两个浮点数的阶码之差,即
ΔE=[Ex]补-[Ey]补=[Ex]补+[-Ey]补
若ΔE=0,表示两个浮点数的阶码相等,即[Ex]补=[Ey]补;若ΔE>0,表示 [Ex]补>[Ey]补;若ΔE<0,表示[Ex]补<[Ey]补。
当ΔE≠0时,要通过浮点数尾数的算术左移或算术右移来改变阶码,使两个浮点数的阶码相等。理论上讲,既可以通过移位[Mx]补以改变[Ex]补来达到[Ex]补=[Ey]补,也可以通过移位[My]补以改变[Ey]补来达到[Ex]补=[Ey]补。但是,由于浮点数的尾数在算术左移的过程会改变尾数的符号位,同时,尾数在算术左移的过程中还会使尾数的高位数据丢失,造成运算结果错误。因此,在对阶时规定使小阶向大阶看齐,通过小阶的尾数算术右移以改变阶码来达到[Ex]补=[Ey]补,尾数每右移一位,阶码加1,其数值保持不变,直到两个浮点数的阶码相等,右移的次数等于ΔE的绝对值。
②尾数进行加法或减法运算
对阶结束后,即可对浮点数的尾数进行加法或减法运算。不论是加法运算还是减法运算,都按加法进行操作,其方法与定点加减运算完全一样。
③结果规格化并进行舍入处理
根据规格化浮点数的定义,当尾数用二进制补码表示时,规格化浮点数的尾数形式为00.1××…××或11.0××…××。若浮点数的尾数不是这两种形式,则称之为非规格化浮点数,需进行浮点数的规格化。
若浮点数的尾数形式为00.0××…××或11.1××…××,应利用向左规格化使其变为规格化浮点数,尾数每算术左移1位,阶码减1,直到浮点数的尾数变成规格化形式。
若浮点数的尾数形式为01.××…××或10.××…××,表示尾数求和的结果发生溢出,应利用向右规格化使其变为规格化浮点数,尾数算术右移1位,阶码加1,此时浮点数的尾数就变成了规格化形式。
在对阶或向右规格化时,尾数都要进行算术右移操作,为了保证运算结果的精度,运算过程中需保留右移中移出的若干位数据,称为保护位。在运算结果进行规格化后再按照某种规则进行舍入处理以去除这些数据。舍入处理就是消除保护位数据并按照某种规则调整剩下的部分,舍入处理总要影响到数据的精度。舍入处理的方法通常选用“0舍1入”法。
④判断溢出
浮点数尾数的溢出可通过规格化进行处理,而浮点数运算结果的溢出则根据运算结果中浮点数的阶码来确定。若阶码未发生溢出,则表示运算结果未发生溢出;若阶码溢出,则需进行溢出处理。
若阶码用双符号位补码表示,判断溢出的方法为:若阶码的双符号位相同,表示结果未发生溢出;若阶码的双符号位不相同,表示结果发生溢出。
2.举例
[例1]设两浮点数x=2001×(0.1101),y=2011×(-0.1010),在浮点数的表示格式中阶码占3位,尾数占4位(都不包括符号位)。阶码和尾数均采用含双符号位的补码表示,运算结果的尾数取单字长(含符号位共5位),舍入规则用“0舍1入”法,用浮点运算方法计算x+y、x-y。
解:[x]浮=00001,00.1101 [y]浮=00011,11.0110
①对阶,小阶向大阶对齐
ΔE=[Ex]补-[Ey]补=[Ex]补+[-Ey]补=00001+11101=11110
x的尾数[Mx]补右移2位,阶码[Ex]补加2
[x]浮=00011,00.0011(01)
其中(01)表示[Mx]补右移2位后移出的最低两位数。
②尾数进行加法、减法运算
即[x+y]浮=00011,11.1001(01)
[x-y]浮=00011,00.1101(01)
③结果规格化并进行舍入处理
和的尾数左移1位,阶码减1,采用“0舍1入”法进行舍入处理后,得
[x+y]浮=00010,11.0011
差已为规格化浮点数,采用“0舍1入”法进行舍入处理后,得
[x-y]浮=00011,00.1101
④判断溢出
和、差的阶码的双符号位均相同,故和、差均无溢出。
所以x+y=2010×(-0.1101)
x-y=2011×(0.1101)
[例2]设两浮点数x=2-011×(0.100101),y=2-010×(-0.011110),在浮点数的表示格式中阶码占3位,尾数占6位(都不包括符号位)。阶码和尾数均采用含双符号位的补码表示,运算结果的尾数取单字长(含符号位共7位),舍入规则用“0舍1入”法,用浮点运算方法计算x+y、x-y。
解:[x]浮=11101,00.100101 [y]浮=11110,11.100010
①对阶,小阶向大阶对齐
ΔE=[Exx]补-[Ey]补=[Ex]补+[-Ey]补=11101+00010=11111
x的尾数[Mx]补右移1位,阶码[Ex]补加1
[x]浮=11110,00.010010(1)
其中(1)表示[Mx]补右移1位后移出的最低一位数。
②尾数进行加法、减法运算
即[x+y]浮=11110,11.110100(1)
[x-y]浮=11110,00.110000(1)
③结果规格化并进行舍入处理
和的尾数左移2位,阶码减2,得
[x+y]浮=11100,11.010010
差已为规格化浮点数,采用“0舍1入”法进行舍入处理后,得
[x-y]浮=11110,00.110001
④判断溢出
和、差阶码的双符号位均相同,故和、差均无溢出。
所以x+y=2-100×(-0.101110)
x-y=2-010×(0.110001)
浮点乘法、除法运算
1.运算步骤
在浮点乘除运算时,为便于浮点数判断溢出和尾数进行阵列乘除运算运算,假设浮点数的阶码采用双符号位补码表示,尾数采用单符号补码或原码表示。
浮点乘法、除法运算步骤如下:
①阶码相加减
按照定点整数的加减法运算方法对两个浮点数的阶码进行加减运算。
②尾数相乘或相除
按照定点小数的阵列乘除法运算方法对两个浮点数的尾数进行乘除运算。为了保证尾数相除时商的正确性,必须保证被除数尾数的绝对值一定小于除数尾数的绝对值。若被除数尾数的绝对值大于除数尾数的绝对值,需对被除数进行调整,即被除数的尾数每右移1位,阶码加1,直到被除数尾数的绝对值小于除数尾数的绝对值。
③结果规格化并进行舍入处理
浮点数乘除运算结果的规格化和舍入处理与浮点数加减运算结果的规格化和舍入处理方法相同。并且在浮点数乘除运算的结果中,由于乘积和商的绝对值一定小于1,因此在浮点乘除运算结果进行规格化处理时只存在向左规格化,不可能出现向右规格化。
④判断溢出
浮点数乘除运算结果的尾数不可能发生溢出,而浮点数运算结果的溢出则根据运算结果中浮点数的阶码来确定,溢出的判定和处理方法与浮点加减运算完全相同。
2.举例
[例1]设两浮点数x=2-001×(-0.100010),y=2-100×(0.010110),在浮点数的表示格式中阶码占3位,尾数占6位(都不包括符号位),阶码采用双符号位的补码表示,尾数用单符号位的补码表示。要求用直接补码阵列乘法完成尾数乘法运算,运算结果的尾数取单字长(含符号位共7位),舍入规则用“0舍1入”法,用浮点运算方法计算x×y。
解:[x]浮=11111,1.011110 [y]浮=11100,0.010110
①阶码相加
[Ex+Ey]补=[Ex]补+[Ey]补=11111+11100=11011
②尾数作直接补码阵列乘法运算
[Mx]补×[My]补=1.110100010100
③结果规格化并进行舍入处理
积的尾数左移2位,阶码减2,采用“0舍1入”法进行舍入处理后,得
[x×y]浮=11001,1.010001
④判断溢出
乘积的阶码的双符号位相同,故乘积无溢出。
所以x×y=2-111×(-0.101111)
[例2]设两浮点数x=2-010×(0.011010),y=2011×(-0.111100),在浮点数的表示格式中阶码占3位,尾数占6位(都不包括符号位),阶码采用双符号位的补码表示,尾数用单符号位的原码表示。要求用原码阵列除法完成尾数除法运算,运算结果的尾数取单字长(含符号位共7位),舍入规则用“0舍1入”法,用浮点运算方法计算x÷y。
解:[x]浮=11110,0.011010 [y]浮=00011,1.111100
①阶码相减
[Exx-Ey]补=[Ex]补+[-Ey]补=11110+11101=11011
②尾数作原码阵列除法运算
[Mx]原=0.011010 [My]原=1.111100
商的符号位为:Mxf⊕Myf=0⊕1=1
令Mx’=011010000000,My’=111100,其中Mx’和My’分别为[Mx]原和[My]原的数值部分,且Mx’为双字长
[Mx’]补=0011010000000,[My’]补=0111100,[-My’]补=1000100
故得商q=0011011
所以[Mx÷My]原=1.011011
因此[x÷y]浮=11011,1.011011
③尾数规格化
商的尾数左移1位,阶码减1。
[x÷y]浮=11010,1.110110
④判断溢出
商的阶码的双符号位相同,故商无溢出。
所以x÷y=2-110×(-0.110110)
浮点加法、减法, 乘法、除法运算相关推荐
- java BigDecimal加法/减法/乘法/除法 保留两位小数
1.BigDecimal类概述及其构造方法 由于在运算的时候,float类型和double类型很容易丢失进度,所以,为了能够精确的表示.计算浮点数,java提供了BigDecimal类 BigDe ...
- pytorch基本数学运算:加法 减法 乘法 除法 指数 对数 绝对值
加法 import torch import numpy as npprint('# 加法') a = torch.Tensor(np.arange(6).reshape(2, 3)) b = tor ...
- c语言加法减法乘法,一元多项式的加法减法乘法c语言描述线性表应用
一元多项式的加法减法乘法 --(c语言描述)线性表应用 来源:永远的北邮人 vc6.0下调试通过 #include #include #include #include #include #inclu ...
- 请编写一个方法,实现整数的乘法、减法和除法运算(这里的除指整除)。只允许使用加号。
方法思路 乘法:a*b就等于b个a相加.题目也说了不考虑性能. 减法:a-b就等于a+(-1)*b;就等于a加上b的相反数,得到b的相反数就解决了. 除法:a/b=n:就是说有n个b相加小于等于a;可 ...
- java实现一元多项式减法_一元多项式 加法 减法 乘法
1 #include 2 #include 3 //系数 coefficient,coef4 //指数 exponent, expon 5 typedef struct polyNode*polyno ...
- 矩阵加法减法乘法计算
矩阵 最近在做重写帧同步矩阵相关运算的时候突然发现自己矩阵乘法运算怎么做了,这里参考别人文档写一篇让自己巩固下矩阵算法.(文章中括号就不画了,用 [ ] 代替了) 矩阵加法 计算公式如下 /// [ ...
- c 语言除法运算,C 语言简单加减乘除运算
C语言也可以进行加减乘除运算,但是运算符号与数学中的略有不同,见下表. 加法 减法 乘法 除法 求余数 数学 + - × ÷ 无 C语言 + - * / % 加号.减号与数学中的一样,乘号.除号不同, ...
- java用流体加减乘除_任意输入两个数,完成加法、减法、乘法、除法运算!(加减乘除运算分别定义四个方法)_学小易找答案...
[简答题]编写程序实现菜单设计 [简答题]一层平面图 [简答题]编写一个程序实现大小写字母转换 [简答题]利用循环语句输出一个五行的等腰三角形,如下图 [简答题]编写一个程序实现交换两个变量的数值. ...
- 7-3 三维向量运算设计一个三维向量类,实现向量加法、减法以及向量与标量的乘法和除法运算。
7-3 三维向量运算 设计一个三维向量类,实现向量加法.减法以及向量与标量的乘法和除法运算.后面添加下面代码完成: 天杀的出题人,非得放个图片在这,放个代码块会死吗? 运行的时候,要把这张图片里的内容 ...
最新文章
- 简单是可靠的先决条件
- MPB:地大郭东毅等-一种针对重金属污染土壤的高效DNA提取方法
- 2018年终总结之AI领域开源框架汇总
- Spark使用总结与分享
- nginx.conf配置详解
- 基于Flask实现后台权限管理系统 - 表设计
- URAL 1146 Maximum Sum(最大子矩阵的和 DP)
- hana数据库导入mysql_【SAP HANA】新建表以及操作数据(3)
- 由于找不到mfc110.dll,无法继续执行代码的解决方法
- 当他不再爱你的时候(男女生一定要看)
- DevOps使用教程 华为云(15)git如何将本地项目初始化为远程仓库
- 超详细 CSS动画-animation
- ubuntu正确安装显卡驱动的姿势
- 易辅客栈 从零学辅助_如何从零启动辅助项目
- 混淆的概念:SIF、CIF、4CIF、D1
- 股票行情图的绘制,分时图和闪电图
- MySQL的COUNT语句--count(*)、 count(常量)、 count(列名)
- 03 【Nginx虚拟主机和域名解析】
- 使用python包scanpy读取单细胞h5ad文件
- “对不起,我是用AI做的警察”