二进制小数和IEEE浮点标准
二进制小数
首先复习进位计数制的要素:
数码:用来表示进制数的元素。比如
- 二进制数的数码为:0,1
- 十进制数的数码为:0,1,2,3,4,5,6,7,8,9
- 十六进制数的数码为:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
基数:数码的个数。比如
- 二进制数的基数为2
- 十进制数的基数为10
- 十六进制数的基数为 16
位权:数制中每一固定位置对应的单位值称为位权。
- 二进制第2位的位权为\(2^1\),第3位的位权为\(2^2\):\((10010.1110)_2 = 1 * 2^4 + 0 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0 + 1 * 2^{-1} + 1 * 2^{-2} + 1 * 2^{-3} + 0 * 2^{-4} = 16 + 2 + 1/2 + 1/4 + 1/8\)
- 十进制第2位的位权为\(10^1\),第3位的位权为\(10^2\):\((123.45)_{10}=1×10^2+2×10^1+3×10^0+4×10^{-1}+5×10^{-2}\)
- 十六进制第2位位权为\(16^1\),第3位的位权为\(16^2\):\((BAD)_{16} =11× 16^2+10×16^1+13×16^0=(2989)_{10}\)
总结来说
十进制表示公式为:

二进制表示公式为:

- 注意:二进制小数不像整数一样,只要位数足够,它就可以表示所有整数。假设我们仅考虑有限长度的编码,那么二进制小数无法精确的表示任意小数,比如十进制小数0.2,我们并不能将其准确的表示为一个二进制数,只能增加二进制长度提高表示的精度。如下图所示,二进制表示十进制的0.2只能无限接近,却永远无法精确表示0.2。

IEEE 浮点表示
于是为了在计算机中准确表示浮点数,IEEE指定了一条标准来规范表示浮点数,若不对浮点数的表示作出明确的规定,同一个浮点数的表示就不是唯一的。例如\((1.75)_{10}\)可以表示成\(1.11×2^0\),\(0.111×2^1\),\(0.0111×2^2\)等多种形式。
IEEE,电气和电子工程师协会( 全称是Institute of Electrical and Electronics Engineers)是一个国际性的电子技术与信息科学工程师的协会,是目前全球最大的非营利性专业技术学会,IEEE 754 标准是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号。
浮点数的存储格式

IEEE754 标准中规定:
- Float 单精度浮点数,用 1 位表示符号,用 8 位表示阶码,用 23 位表示尾数,一共32位。
- double 双精度浮点数,用 1 位表示符号,用 11 位表示阶码,52 位表示尾数,一共64位。
阶码:阶码是整数,阶符和 m 位阶码的数值部分共同反映 浮点数的表示范围及小数点的实际位置 ,常用移码或补码表示。IEEE754标准中采用移码的表示形式。
- 移码:移码(又叫增码)是对真值补码的符号位取反,一般用作浮点数的阶码,引入的目的是便于浮点数运算时的对阶操作。

尾数:数符表示浮点数的符号,尾数的数值部分的位数 n 反映浮点数的 精度 ,常用原码或补码表示。IEEE754标准中采用原码的表示形式
浮点数的表示格式
浮点数表示法是指以适当的形式将比例因子表示在数据中,让小数点的位置根据需要而浮动。这样,在位数有限的情况下,既扩大了数的表示范围,又保持了数的有效精度。

浮点数的真值为:
\]
其中
- S代表符号位,取值为0或1
- e代表指数,E代表阶码
- \(e=E-127(Float)\),\(e=E-1023(Double)\)
- \(E=e_移-1\)
- 计算指数e时,对阶码E的计算采用原码的计算方式,因此单精度浮点数(Float)的阶码E为8位的取值范围是0到255。根据规定,阶码E既不全为0(数值0),也不全为1。
- 所以单精度下8位阶码E的规格化的浮点数阶码范围是1至254,因此指数e的范围则为-126至127。
- 双精度下11位阶码E的规格化的浮点数阶码范围是1至2046,所以指数e范围为-1022至1023。
- M代表尾数,决定浮点数的精度,它是一个二进制小数,表示为\(M=1+f\)
- 其中\(f\)是n 位的尾数所表示的小数值,满足\(0\le f<1\),其二进制表示为:\(\small {0.f_{n-1}f_{n-2}\cdot \cdot \cdot f_{1}f_{0}}\) ,也就是二进制小数点在最高有效位的左边。
- 由于是\(1+f\),所以我们又可以看成\(\small {1.f_{n-1}f_{n-2}\cdot \cdot \cdot f_{1}f_{0}}\)
- 所以尾数的范围为\(1 \le M < 2\)
由上面的每个对应位置的范围,我们可以求得
- 单精度最小规格化正数为:\(x=(-1)^0×2^{-126}×1\)
- 单精度最大规格化正数为:\(x=(-1)^0×2^{127}×(2-2^{-23})\)
例题

a:
0,01,其中0代表是正数,所以原码和补码相同,01→\(0*2^1+1*2^0=1\),所以阶码为+1
1.1001,其中1代表是负数,所以原码为补码末尾减一(1000),按位取反(0111),对应真值为-0.0111=\(-(2^{-2}+2^{-3}+2^{-4})=-\frac{7}{16}\)
所以\(a=2^1×(-0.0111)=2^1×(-\frac{7}{16})=-\frac{7}{8}\)
b:
0,01,对应真值为+1
0.01001对应真值为+0.01001=\(+(2^{-2}+2^{-5})=+\frac{9}{32}\)
所以\(b=2^1×(+0.01001)=2^1×\frac{9}{32}=\frac{9}{16}\)
规格化单精度浮点数
为了提高数据的表示精度同时保证数据表示的唯一性,需要对浮点数做规格化处理。
在计算机内,对非0值的浮点数,要求尾数的绝对值必须大于基数R(这里R=2)的倒数,即\(|M|≥1/R\)
0.5规格化
0.5的二进制为0.1
符号位S为0,指数为\(e=-1\)(为啥?我猜是因为0.1中1的最高位是-1),规格化后尾数为1.0(为啥?因为M最小为1.0)。
单精度浮点数尾数域共23位,右侧以0补全,尾数域:
\]
阶码E:
\]
对照单精度浮点数的存储格式,将符号位S,阶码E和尾数域M存放到指定位置,得0.5的机器码:
\]
1.5规格化
1.5的二进制为1.1
符号位为0,指数\(e=0\)(为啥?我猜是因为1.1中1的最高位是0),规格化后尾数为1.1(为啥?因为二进制为1.1,所以M就是1.1,如果二进制是1111,M就是1.111)。
尾数域M右侧以0补全,得尾数域:
\]
阶码E:
\]
得1.5的机器码:
\]
5规格化
5的二进制为101
符号位为0,指数为\(e=2\),规格化后尾数为1.01(为啥?因为二进制为101,所以M就是1.01)。
单精度浮点数尾数域共23位,右侧以0补全,尾数域:
\]
阶码E:
\]
得5的机器码:
\]
参考文献
浮点数的表示 -- 基本格式、规格化、表示范围_starter_____的博客-CSDN博客_浮点数规格化表示
详解 浮点数的规格化表示_Hello.Aaric的博客-CSDN博客_浮点数规格化
IEEE754 浮点数的表示方法_Dablelv的博客专栏-CSDN博客_ieee 754
二进制小数和IEEE浮点标准的更多相关文章
- 深入理解计算机系统(2.7)------二进制小数和IEEE浮点标准
整数的表示和运算我们已经讲完了,在实际应用中,整数能够解决我们大部分问题.但是某些需要精确表示的数,比如某件商品的价格,某两地之间的距离等等,我们如果用整数表示将会有很大的出入,这时候浮点数就产生了. ...
- 二进制小数及 IEEE 浮点表示
1.二进制小数 前面这篇博客 进制间的转换 我们已经讲过了各个进制数的表示.现在我们复习一下: 进位计数制的要素: ①.数码:用来表示进制数的元素.比如二进制数的数码为:0,1.十进制数的数码为:0 ...
- IEEE浮点标准
原文地址:http://www.math.byu.edu/~schow/work/IEEEFloatingPoint.htm Floating point system Floating point ...
- 深入理解计算机系统(2.7)---二进制浮点数,IEEE标准(重要)
2.6我们进行了二进制整数运算的最后一役,本次LZ将和各位一起进入浮点数的世界,这里没有无符号,没有补码,但是有各种各样的惊奇.倘若你真正的进入了浮点数的世界,一定会发现它原来是这么有意思,而不是像之 ...
- 深入理解计算机系统(2.8)---浮点数的舍入,Java中的舍入例子以及浮点数运算(重要)
前言 上一章我们简单介绍了IEEE浮点标准,本次我们主要讲解一下浮点运算舍入的问题,以及简单的介绍浮点数的运算. 之前我们已经提到过,有很多小数是二进制浮点数无法准确表示的,因此就难免会遇到舍入的问题 ...
- CSAPP:信息的表和处理2
CSAPP:信息的表和处理2 关键点:浮点数.浮点数运算. 二进制小数IEEE浮点数表示浮点数转换(单精度)参考 二进制小数 形如表示的二进制数,其中每个位的取值范围位0和1.这种表示方式的定义如 ...
- 【CSAPP笔记】3. 浮点数
回想起刚学C语言时,我对浮点数的印象大概是"能够表示小数"的数据类型.还死记硬背过例如什么"小数用double存,用%f输出"这类的话.实际上呢,浮点数可以用这 ...
- c 浮点数
一.二进制小数 十进制小数: 12.3410 == 1 * 101 + 2 * 100 + 3 * 10-1 + 4 * 10-2 = 12(34/100) (可能很多人还不知道怎么计算一个数的负幂, ...
- Ch2信息的表示和处理——caspp深入理解计算机系统
目录 第2章 信息的表示和处理 2.1 信息存储 2.1.1 十六进制 一.表示法 二.加减 三.进制转换 2.1.2 字 2.1.3 数据大小 2.1.4 字节顺序与表示 一.字节的排列规则 二.打 ...
随机推荐
- Java实现 蓝桥杯VIP 算法提高 分数统计
算法提高 分数统计 时间限制:1.0s 内存限制:512.0MB 问题描述 2016.4.5已更新此题,此前的程序需要重新提交. 问题描述 给定一个百分制成绩T,将其划分为如下五个等级之一: 9010 ...
- Java实现 LeetCode 98 验证二叉搜索树
98. 验证二叉搜索树 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右 ...
- Java实现 洛谷 P1980 计数问题
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = ...
- java实现孪生素数
** 孪生素数** 孪生素数 所谓孪生素数指的就是间隔为 2 的相邻素数,它们之间的距离已经近得不能再近了,就象孪生兄弟一样.最小的孪生素数是 (3, 5),在 100 以内的孪生素数还有 (5, 7 ...
- PAT 反转链表
给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4:如果 K 为 4,则输出应该 ...
- Python爬虫之request +re
什么是爬虫? 它是指向网站发起请求,获取资源后分析并提取有用数据的程序: 爬虫的步骤: 1.发起请求 使用http库向目标站点发起请求,即发送一个Request Request包含:请求头.请求体等 ...
- JavaScript使用for循环和splice删除数组指定元素的注意点
在JavaScript里可以结合for循环和splice来删除数组指定的元素.但是要注意删除元素后,数组索引会发生改变 示例 var arr = ["a","b" ...
- 彻底搞懂 etcd 系列文章(一):初识 etcd
0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...
- [computer graphics]世界坐标系->相机坐标系详细推导
基变换 理论部分 在n维的线性空间中,任意n个线性无关的向量都可以作为线性空间的基,即空间基不唯一.对于不同的基,同一个向量的坐标一般是不同的.因为在计算机图形学中,主要研究三维的空间,所以可以简化问 ...
- 如何向这些CA来申请数字证书呢?
申请的过程大致是: 1.自己本地先生成一对密匙,然后拿着自己的公匙以及其他信息(比如说企业名称啊什么的)去CA申请数字证书. 2.CA在拿到这些信息后,会选择一种单向Hash算法(比如说常见的MD5) ...