电子科技大学 - 计算机组成原理

小数的十进制和二进制转换

移码

定义:[X] = X + 2n ( -2n ≤ X < 2n )
X为真值,n为整数的位数

数值位和X的补码相同,符号位与补码相反

舍入方法

0舍1入

保留4位尾数:
0 00100 -> 0 0010
/*
**0直接舍去
*/
1 00101 -> 1 0011
/*
**1进位
*/
1 11011 -> 1 1110

末位恒置1

保留4位尾数:
0 00100 -> 0 0011
1 00101 -> 1 0011
1 11011 -> 1 1101

IEEE 754

32位单精度

Sign 8位阶码 [偏移量为28-1-1 = 127的非标准移码] 23位尾数
真值表达式 E的取值范围
N = (-1)s × 2E-127 × 1.M 1到254

64位双精度

Sign 11位阶码 [偏移量为211-1-1 =1023的非标准移码] 252位尾数
真值表达式 E的取值范围
N = (-1)s × 2E-1023 × 1.M 1到2046

为了确保浮点数表示的唯一性,约定 0 ≤ M < 1

各字段的含义( 以单精度为例 )

规范浮点数

1 ≤ E ≤ 254

真值表达式:N = (-1)s × 2E-127 × 1.M,尾数部分隐含开头的1

  • 最小的正规格化数
0 0000 0001 0000 0000 0000 0000 0000 000
  • 最大的正规格化数
0 1111 1110 1111 1111 1111 1111 1111 111

非规范浮点数

E = 0,M ≠ 0

s 0000 0000 ≠ 0

真值表达式:N = (-1)s × 2-126 × 0.M,尾数部分不隐含开头的1

最小的正非规格化数

s 0000 0000 0000 0000 0000 0000 0000 001

最大的正非规格化数

s 0000 0000 1111 1111 1111 1111 1111 111

浮点数0

E = 0,M = 0

s 0000 0000 0000 0000 0000 0000 0000 000

有+0.0和-0.0两种零

无穷大

E全为1(255),M = 0

正无穷大

0 1111 1111 0000 0000 0000 0000 0000 000

负无穷大

1 1111 1111 0000 0000 0000 0000 0000 000

NaN Not a Number

计算sqrt(-1)或∞-∞时会返回NaN

E全为1(255),M ≠ 0

s 1111 1111 ≠ 0

为什么要使用127作为偏移量而不是128


https://stackoverflow.com/questions/8909841/why-does-the-ieee-754-standard-use-a-127-bias

溢出

上溢:阶码大于机器的最大阶码,不能继续运算,一般要进行中断处理

下溢:阶码小于最小阶码,当做零处理,机器可以继续运算

规格化浮点数

  • 当尾数结果为00.0x…x 或 11.1x…x
    尾数左移,阶码减1,直到尾数形式为00.1x…x 或 11.0x…x

  • 当尾数结果为01.x…x 或 10.x…x
    尾数右移,阶码加1,尾数形式变为00.1x…x 或 11.0x…x

阶码加减

设:
AE、BE为阶码,CE为结果阶码

[ AE + BE ]
= ( AE + BE ) + 127
= ( AE + 127 ) + ( BE + 127 ) - 127
= [ AE ] + [ BE ] -127
= [ AE ] + [ BE ] + [ -127 ]
= [AE] + [BE] + 129

= ( [AE] + [BE] + 129 ) mod 28

[ AE - BE ]
= ( AE - BE ) + 127
= ( AE + 127 ) - ( BE + 127 ) + 127
= [ AE ] - [ BE ] + 127

= ( [AE] - [BE] + 127 ) mod 28

浮点数加减

设:
A = 2AE × AM,B = 2BE × BM
AE、BE为阶码,AM、BM为尾数

舍入

右移时:

  • 0舍1入
  • 末位恒置1

例题

x = 0.5, y = 0.4375, 32位单精度表示,求x + y和x - y

转换为二进制

  1. 0.5 x 2 = 1.0 取1

0.1 → 1.0 x 2 -1
[x] =

0 0111 1110 0000 0000 0000 0000 0000 000
-1 + 127 = 126
  1. 0.4375 x 2 = 0.875 取0
  2. 0.8750 x 2 = 1.750 取1
  3. 0.7500 x 2 = 1.500 取1
  4. 0.5000 x 2 = 1.000 取1

-0.0111 → 1.11 x 2-2

[y] =

1 0111 1101 1100 0000 0000 0000 0000 000
-2 + 127 = 125

求阶差

(0111 1110 - 0111 1101 + 127)mod 28 = 1
y向x对齐
y = 0.111 x 2-1
[y] =

1 0111 1110 1110 0000 0000 0000 0000 000

尾数加减

+
00.0000 0000 0000 0000 0000 000
00.0010 0000 0000 0000 0000 000
00.0010 0000 0000 0000 0000 000

结果为00.0x…x,左规
得到1.0… x 2-4

结果 = 0.0625

0 0111 1011 0000 0000 0000 0000 0000 000
-4 + 127 = 123
-
00.0000 0000 0000 0000 0000 000
00.1110 0000 0000 0000 0000 000
00.1110 0000 0000 0000 0000 000

结果 = 0.9345

0 0111 1110 1110 0000 0000 0000 0000 000

IEEE 754 浮点数加减运算的更多相关文章

  1. IEEE 754 浮点数在计算机中的表示方法

    IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用.这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denorma ...

  2. velocity加减运算注意格式 ,加减号的左右都要有空格

    velocity加减运算注意格式 ,加减号的左右都要有空格 #set( $left= $!biz.value - $vMUtils.getReturnMoney($!biz.billBuy) )

  3. [Swift]LeetCode592. 分数加减运算 | Fraction Addition and Subtraction

    Given a string representing an expression of fraction addition and subtraction, you need to return t ...

  4. C语言中指针变量的加减运算

    1.指针变量中存放的是地址值,也就是一个数字地址,例如某指针变量中的值是0x20000000,表示表示此指针变量存放的是内存中位于0x20000000地方的内存地址.指针变量可以加减,但是只能与整型数 ...

  5. 大整数加减运算的C语言实现

    目录 大整数加减运算的C语言实现 一. 问题提出 二. 代码实现 三. 效果验证 大整数加减运算的C语言实现 标签: 大整数加减 C 一. 问题提出 培训老师给出一个题目:用C语言实现一个大整数计算器 ...

  6. Linux中日期的加减运算

    Linux中日期的加减运算 目录 在显示方面 在设定时间方面 时间的加减 正文 date命令本身提供了日期的加减运算. date 可以用来显示或设定系统的日期与时间. 回到顶部 在显示方面 使用者可以 ...

  7. void *指针的加减运算

    1.手工写了一个程序验证void *指针加减运算移动几个字节: //本程序验证空类型指针减1移动几个字节 #include <stdio.h> int main(int argc, cha ...

  8. Leetcode 592.分数加减运算

    分数加减运算 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分 ...

  9. C语言中指针的加减运算

    参考文章,值得一看 char arr[3]; printf("arr:\n%d\n%d\n%d\n", arr, arr + 1, arr + 2); char *parr[3]; ...

随机推荐

  1. 八款优秀Linux浏览器推荐

    #1.Firefox:互联网革命的新典范   众所周知,Firefox最大的优点就是拥有数以千计的插件,能够使得用户个性化自己的浏览器.与此同时,Firefox还是一款时尚.快捷.创新.高效的浏览器, ...

  2. Java的Class类及static块的执行时机

    要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的,这项工程由Class对象完成,它包含了与类有关的信息.Java使用Class对象来执行其RTTI,即使你执行的是类似转型 ...

  3. JavaScript高级程序设计学习笔记之事件

    1.事件流 事件流描述的是从页面中接收事件的顺序. 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播 ...

  4. 初识Ansible 01

    自动化运维工具有很多,从实现的功能.维护的成本.使用的系统来选择,几种常用运维工具比较: Puppet基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱 SaltS ...

  5. IPSec协议框架

    文章目录 1. IPSec简介 1.1 起源 1.2 定义 1.3 受益 2. IPSec原理描述 2.1 IPSec协议框架 2.1.1 安全联盟 2.1.2 安全协议 报文头结构 2.1.3 封装 ...

  6. Mybatis-Plus常用的查询方法--看这一篇就够了!!!

    前言: Mybatis-Plus作为Mybatis的增强,自己封装了很多简单还用的方法,来解脱自己写sql! 对于项目的搭建小编就不在说了,可以参考: SpringBoot+Mybatis-Plus的 ...

  7. 计算机网络参考模型和5G模型的那些事

    一.分层思想 二.OSI参考模型 三.TCP/IP协议族 四.数据封装和解封装过程 五.层间通讯过程 六.3GPP规范及5G协议栈 一.分层思想 享用牛奶的人未必了解其生产过程 使用网络的人未必知道数 ...

  8. Java == 和 equals的区别

    == 是操作符,equals是方法. 对于基本类型变量来说,只能使用 == ,因为基本类型的变量没有方法.使用==比较是值比较. 对于引用类型的变量来说,==比较的两个引用对象的地址是否相等.所有类都 ...

  9. CodeForce-801C Voltage Keepsake(二分)

    题目大意:有n个装备,每个设备耗能为每单位时间耗能ai,初始能量为bi;你有一个充电宝,每单位时间可以冲p能量,你可以在任意时间任意拔冲. 如果可以所有设备都可以一直工作下去,输出-1:否则,输出所有 ...

  10. 【原创】自制string类型(已完成)

    这篇文章首发于360doc http://www.360doc.com/content/21/0526/17/73755266_979099504.shtml ,其实360doc里面的那个也是我的帐号 ...