二进制小数

首先复习进位计数制的要素:

  1. 数码:用来表示进制数的元素。比如

    • 二进制数的数码为: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. 基数:数码的个数。比如

    • 二进制数的基数为2
    • 十进制数的基数为10
    • 十六进制数的基数为 16
  3. 位权:数制中每一固定位置对应的单位值称为位权。

    • 二进制第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 标准中规定:

  1. Float 单精度浮点数,用 1 位表示符号,用 8 位表示阶码,用 23 位表示尾数,一共32位。
  2. double 双精度浮点数,用 1 位表示符号,用 11 位表示阶码,52 位表示尾数,一共64位。
  • 阶码:阶码是整数,阶符和 m 位阶码的数值部分共同反映 浮点数的表示范围及小数点的实际位置 ,常用移码或补码表示。IEEE754标准中采用移码的表示形式。

    • 移码:移码(又叫增码)是对真值补码的符号位取反,一般用作浮点数的阶码,引入的目的是便于浮点数运算时的对阶操作。

  • 尾数:数符表示浮点数的符号,尾数的数值部分的位数 n 反映浮点数的 精度 ,常用原码或补码表示。IEEE754标准中采用原码的表示形式

浮点数的表示格式

浮点数表示法是指以适当的形式将比例因子表示在数据中,让小数点的位置根据需要而浮动。这样,在位数有限的情况下,既扩大了数的表示范围,又保持了数的有效精度。

浮点数的真值为:

\[x=(−1)^S×2^e×M
\]

其中

  • 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补全,尾数域:

\[M=[000\ 0000\ 0000\ 0000\ 0000\ 0000]_2​
\]

阶码E:

\[E=[−1]_移​−1=[0111\ 1111]_2​−1=[0111\ 1110]_2​
\]

对照单精度浮点数的存储格式,将符号位S,阶码E和尾数域M存放到指定位置,得0.5的机器码:

\[0.5=[0011\ 1111\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000]_2
\]

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补全,得尾数域:

\[M=[100\ 0000\ 0000\ 0000\ 0000\ 0000]_2
\]

阶码E:

\[E=[0]_移-1=[1000 0000]_2-1=[0111 1111]_2
\]

得1.5的机器码:

\[1.5=[0011\ 1111\ 1100\ 0000\ 0000\ 0000\ 0000\ 0000]_2
\]

5规格化

5的二进制为101

符号位为0,指数为\(e=2\),规格化后尾数为1.01(为啥?因为二进制为101,所以M就是1.01)。

单精度浮点数尾数域共23位,右侧以0补全,尾数域:

\[M=[010\ 0000\ 0000\ 0000\ 0000\ 0000]_2
\]

阶码E:

\[E=[2]_移−1=[1000\ 0010]_2−1=[1000\ 0001]_2
\]

得5的机器码:

\[5=[0100\ 0000\ 1010\ 0000\ 0000\ 0000\ 0000\ 0000]_2
\]

参考文献

浮点数的表示 -- 基本格式、规格化、表示范围_starter_____的博客-CSDN博客_浮点数规格化表示

详解 浮点数的规格化表示_Hello.Aaric的博客-CSDN博客_浮点数规格化

浮点数表示_shuzfan的专栏-CSDN博客_浮点数

IEEE754 浮点数的表示方法_Dablelv的博客专栏-CSDN博客_ieee 754

二进制小数和IEEE浮点标准的更多相关文章

  1. 深入理解计算机系统(2.7)------二进制小数和IEEE浮点标准

    整数的表示和运算我们已经讲完了,在实际应用中,整数能够解决我们大部分问题.但是某些需要精确表示的数,比如某件商品的价格,某两地之间的距离等等,我们如果用整数表示将会有很大的出入,这时候浮点数就产生了. ...

  2. 二进制小数及 IEEE 浮点表示

    1.二进制小数 前面这篇博客 进制间的转换  我们已经讲过了各个进制数的表示.现在我们复习一下: 进位计数制的要素: ①.数码:用来表示进制数的元素.比如二进制数的数码为:0,1.十进制数的数码为:0 ...

  3. IEEE浮点标准

    原文地址:http://www.math.byu.edu/~schow/work/IEEEFloatingPoint.htm Floating point system Floating point ...

  4. 深入理解计算机系统(2.7)---二进制浮点数,IEEE标准(重要)

    2.6我们进行了二进制整数运算的最后一役,本次LZ将和各位一起进入浮点数的世界,这里没有无符号,没有补码,但是有各种各样的惊奇.倘若你真正的进入了浮点数的世界,一定会发现它原来是这么有意思,而不是像之 ...

  5. 深入理解计算机系统(2.8)---浮点数的舍入,Java中的舍入例子以及浮点数运算(重要)

    前言 上一章我们简单介绍了IEEE浮点标准,本次我们主要讲解一下浮点运算舍入的问题,以及简单的介绍浮点数的运算. 之前我们已经提到过,有很多小数是二进制浮点数无法准确表示的,因此就难免会遇到舍入的问题 ...

  6. CSAPP:信息的表和处理2

    CSAPP:信息的表和处理2 关键点:浮点数.浮点数运算. 二进制小数IEEE浮点数表示浮点数转换(单精度)参考 二进制小数   形如表示的二进制数,其中每个位的取值范围位0和1.这种表示方式的定义如 ...

  7. 【CSAPP笔记】3. 浮点数

    回想起刚学C语言时,我对浮点数的印象大概是"能够表示小数"的数据类型.还死记硬背过例如什么"小数用double存,用%f输出"这类的话.实际上呢,浮点数可以用这 ...

  8. c 浮点数

    一.二进制小数 十进制小数: 12.3410 == 1 * 101 + 2 * 100 + 3 * 10-1 + 4 * 10-2 = 12(34/100) (可能很多人还不知道怎么计算一个数的负幂, ...

  9. Ch2信息的表示和处理——caspp深入理解计算机系统

    目录 第2章 信息的表示和处理 2.1 信息存储 2.1.1 十六进制 一.表示法 二.加减 三.进制转换 2.1.2 字 2.1.3 数据大小 2.1.4 字节顺序与表示 一.字节的排列规则 二.打 ...

随机推荐

  1. Java实现 LeetCode 40 组合总和 II(二)

    40. 组合总和 II 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在 ...

  2. IDEA突然无法运行

    可能是你类的main方法被idea的智能提示改了 PS: 小编经常用智能提示,它给我把main方法的static关键字删掉了好几次,当时怎么也没想到是把main方法改了 ~难受

  3. Java实现 洛谷 P1914 小书童——密码

    import java.util.Scanner; public class Main { private static Scanner cin; public static void main(St ...

  4. Java实现第八届蓝桥杯购物单

    购物单 题目描述 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打 ...

  5. Java实现第八届蓝桥杯包子凑数

    包子凑数 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子.每种蒸笼都有非常多笼,可以认为是无限笼. 每当有顾客想买X个包子,卖包子的大叔 ...

  6. Windows下虚拟机Linux(CentOS8)扩容设置 - 磁盘扩容中的坑和解决方法

    摘要:[原创]转载请注明作者Johnthegreat和本文链接 由于虚拟机空间不足,为了避免重装虚拟机,做了一次无损扩容.   过程中的报错如下: [root@localhost ~]# pvcrea ...

  7. mysql基础-数据类型和sql模式-学习之(三)

    0x01 mysql的两种方向: 开发DBA:数据库设计(E-R关系图).sql开发.内置函数.存储历程(存储过程和存储函数).触发器.时间调度器(event scheduler) 运维----> ...

  8. Servlet Session MVC模式

    一   什么是Session 当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId). ...

  9. 在PyQt5中显示matplotlib绘制的图形

    import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import * from plot_pyqt import PlotCanva ...

  10. ojdbc6中OraclePreparedStatement的ArrayIndexOutOfBoundsException异常BUG-6396242

    现场信息 Caused by: java.lang.ArrayIndexOutOfBoundsException: -32203 at oracle.jdbc.driver.OraclePrepare ...