如何深刻理解IEEE浮点数的表示(IEEE floating-point representation)

article/2025/6/10 5:26:05

引言

大家都知道,可以在计算机处理器直接运行的是由0,1构成的机器代码(machine code),本文将介绍浮点数(floating-point number )在机器码中是如何被编码表示的
整数(integer)是如何被编码的呢?小伙伴们应该听过补码,原码,反码吧,这些正是整数被编码的不同规则。

原码:一定字长,在不溢出的情况下,最高位是符号位,跟上该整数二进制表示。符号位中0代表正数,1代表负数。
补码(two's compliment):最高位也是符号位,但是与原码不同的是符号位也参与到求值里。
例如:1001=-2^3+1=-7
而原码中 1001=-1

代表同一数值的原码是可以转换成其补码的。

 很多文章里说补码是无法直接转换成十进制数值,要先换成原码再求,其实这是错误的。理解补码最高位也是参与值的即可。

后续笔者将会撰写一篇文章详细讲解原码,补码,以及反码。

下面开始正题吧!

浮点数(floating-point number)是什么

其实计算机表示小数有两种方式:

  1. 定点数 (fixed-point)
  2. 浮点数(floating-point)
    区别在于,定点数编码小数时小数点位置是确定的,浮点数小数点位置是可以变化的。
    如何用科学计数法来表示二进制小数,即形如:
    V = ( − 1 ) s × M × 2 E V=(-1)^s \times M \times 2^E V=(1)s×M×2E
    0.25(d)可以写作
    0.01 ( b ) × 2 0 0.01(b)\times2^0 0.01(b)×20
    也可以写作
    1.0 ( b ) × 2 − 2 1.0(b)\times 2^{-2} 1.0(b)×22
注:括号中的字母
d表示十进制 decimal
b表示二进制 binary
h表示十六进制 hexadecimal

IEEE floating-point representation

正如上文所述,IEEE是编码小数的一种标准。类比一下十进制的科学计数法,实际上也算一种标准,要写成形如
a × 1 0 b ( 其 中 ∣ a ∣ > = 1 且 < 10 ) a\times10^b (其中|a|>=1且<10) a×10ba>=1<10
而二进制和十进制的区别只是基数不同,二进制也可以写成像科学计数法的形式。
而计算机正是用了这种方式

IEEE表示数V,而V可以写成如下形式:
V = ( − 1 ) s × M × 2 E V=(-1)^s \times M \times 2^E V=(1)s×M×2E
已知数字特点,那么计算机只需要存取s,M,E即可。

s: sign ***占最高的一位***,可以看出是**符号位**,s=1表示负数(或0),s=0表示正数(或0)
M: significand **尾数**,二进制小数
E: exponent 对该数加权(可能是负数)

计算机常见字长有 32bit 64bit,因此IEEE规定了对应的两种不同位数的编码方式:
32位称为单精度
64位称为双精度

这些数就是想把 s,M,E 存起来
最简单的方法就是直接全部转换成对应的二进制数,放到对应的位置上,显然IEEE不是这样。

在这里插入图片描述
如图,图中s编码s,exp编码E,frac编码M。这里的编码规则其实就是IEEE浮点数表示的核心了。

三种情况

设exp位有k位,frac有n位

Case 1(normalized values): exp位不全为0 且 不全为1

规定:
E=exp-Bias
Bias翻译为偏置量 且规定
B i a s = 2 k − 1 − 1 Bias=2^{k-1}-1 Bias=2k11
稍后分析Bias这样规定的原因。

根据位数和exp位的限定,我们可以推测出case1可表示的值范围。

在这里插入图片描述

由此图得知,E的范围比较对称,有一定负数,让浮点数中较小的值也可以编码。

M=1+ frac
由此可见,case1 无法表示0, 因为M永远大于等于1。

Case 2 (denormalized values):
exp位全部0
规定:
E=1-Bias(Bias=2^(k-1)-1)
M=frac

作用:

  1. 表示0 (+0与-0)。
  2. 表示一些非常接近于0的小数。

Case 3(special values):
exp位全部为1

当frac位不全为0时:
表示NaN(not a number) 比如根号下-1

当frac位全为0时:
如:k=3,n=2时
111100 011100 分别表示-∞与+∞

case正负EM
case 1: exp位不全为0或1s=0为正,s=1为负E=exp-BiasM=1+frac
case 2:exp位全部是0s=0为正,s=1为负E=1-BiasM=frac
case 3:exp位全部是1frac=0,s=0表示正无穷,s=1为负无穷;frac!=0,均表示NaNNANA

特点

可以看出一定位数能表示的二进制浮点数是有限的。

k=2,n=2时,让我们列出该情况下可以编码的所有数。
易知,bias=2^1-1=1

为了直观,V都化成了以4为分母的分数。

no.biteEfMV
10 00 0000000
20 00 01001/41/41/4
30 00 10001/21/22/4
40 00 11003/43/43/4
50 01 001001.04/4
60 01 01101/44/55/4
70 01 10101/23/26/4
80 01 11103/47/47/4
90 10 0021018/4
100 10 01211/45/410/4
110 10 10211/23/212/4
120 10 11213/47/414/4
130 11 00----+∞
140 11 01----NaN
160 11 10----NaN
170 11 11----NaN

其中
大家也可以自己列一下这个表,加深理解。

同时我们发现了从case 1到case 2的变化是非常均匀 的,V的变化量为1/16,这正是case2中 规定E=1-bias 的用意!!!
但是注意后面V值变化并不均匀!!!

我们来讲两个例子。

  1. 0 00 10
    可以其判断属于case 2(exp位都是0)
    exp: 00(binary)=0(decimal)
    E=1-bias=1-3=-2
    frac: 0.10(b)=1/4(d)
    M=f= 1/4(d)
    V=2^(0)✖️1/4✖️2 ^(-2)=1/16

  2. 0 10 11
    可以其判断属于case 1(exp位不都是1或者0)
    exp: 10(b)=2(d)
    E=exp-bias=2-3=-1
    frac: 0.11(binary)=3/4(decimal)
    M=1+f=7/4(d)
    V=2^(0)✖️7/4✖️2 ^(-1)=14/16

V与IEEE表示的相互转换

IEEE位格式(bit representation)到V

上文在讲例子时,已经介绍了从位格式求V值。
步骤:

  1. 根据exp位判断属于哪个case
  2. 写出s,exp,frac 根据不同规则求出E,M
  3. 代入公式

V = ( − 1 ) s × M × 2 E V=(-1)^s \times M \times 2^E V=(1)s×M×2E

V转换成IEEE位格式

步骤:

  1. 明确单精度还是双精度。顺势求出bias值
    单精度: s 1位, exp 8位, frac 13位,bias=127
    双精度: s 1位, exp 11位,frac 52位,bias=1023
  2. 判断是case 1 还是case 2(case3 的情况只有+∞和NaN)
    Bit representation很好看出 exp。
    这种情况也不难,判断一个范围即可,求出case 1能表示的最大值(正数为例)。

单精度:
1 00000000 1111111111111
exp=0
E=1-bias-1-127=-126
frac=0.1111111111111(b)=0.9998779296875
M=0.9998779296875
V=2^(-126)✖️0.999877929687
约等于
1.17535 × 1 0 − 38 1.17535\times 10^{-38} 1.17535×1038
若V比此值小,则是case 1。否则是case 2。

双精度
该值约等于
2.22507 × 1 0 − 308 2.22507\times 10^{-308} 2.22507×10308

  1. 将V值转换成二进制(只考虑能确切转换成二进制的情况),并化成标准型
    形如
    V = ( − 1 ) s × M × 2 E V=(-1)^s \times M \times 2^E V=(1)s×M×2E
    注意:
    case 1, 用E来加权,调整M到位数1.xxxxxxx
    case 2, 用E来加权,调整M到位数0.xxxxxxx

举例:
单精度下,V=12345.0(d)
解:显然属于case 1
12345.0(d)=11000000111001
化标准型
V = 2 0 × 1.1000000111001 × 2 13 V=2^{0}\times1.1000000111001\times 2^{13} V=20×1.1000000111001×213
则 s=0
frac=10000001110010000000000 【13位,少了还得在后面补0,凑成23位】
E=13
exp=E+bias=13+127=140=10001100(b)【恰好8位,少了在前面补0
则位表达为
01000110010000001110010000000000 0 1000110010000001110010000000000 01000110010000001110010000000000

舍入问题 (Rounding)

“Floating-point arithmetic can only approximate real arithmetic, since the representation has limited range and precision. Thus, for a value x, we generally want a systematic method of finding the ‘closest’ value.”

“The IEEE floating-point format defines four different rounding modes. The default method finds a closest match, while the other three can be used for computing upper and lower bounds”

其中说的默认方法是round-to-even,它和传统的四舍五入的唯一区别就是对中值的处理。
四舍五入,顾名思义,五永远是要进位的。
而round-to-even,五的话要round到最近的偶数值。

比如:1.5 四舍五入后 2
1.5 round-to-even 2
2.5 四舍五入后 3
2.5 round-to- even 2

优势:
在统计时,若采用四舍五入,那么数据值总是偏大一些,而round-to-even方法在中值处舍和入的概率都是0.5,数据值较为准确。

mode1.41.61.52.5-1.5
四舍五入1223-2
round-to-even1222-2
round-toward-zero1112-1
round-down1112-2
round-up2223-1

round-toward-zero 模式就是在向0舍入。
round- down就是向数轴负方向舍。
round-up就是向数轴正方向入。

补充:

  1. round-to- even在保留一定位小数时也可以用到。
    比如:1.2350和1.2450保留2位小数。用round-to-even mode后都是1.24
  2. 二进制也可以用round-to-even
    0为even(偶数),1为odd(奇数)
    比如:保留2位小数。
    10.00011 (b)应该为 10.00(b) 而 10.00110(b)应该为10.01(b)。这两个数都不是中值。
    举两个中值(请体会这里中值的含义,是对于保留2位小数而言的)的例子吧!
    10.001(b)应该舍为 10.00(b)
    10.111(b)应该进入为11.00(b)
    注意:都是让小数舍入后最低位为even,即0

二进制小数舍入(Round-to-even)例题:

保留一位小数

before与中值的关系after
10.011大于中值,要入10.1
10.010等于中值,要round-to-even(0)10.0
10.110等于中值,要round-to-even(0)11.0
11.001小于中值,要舍11.0

关于中值:
10.0xx保留一位小数,其中值为10.010,准确的说,10.010是10.0(舍后的值)与10.1(入后的值)的中值。
类比1.5是1(舍后的值)和2(入后的值)的中值。

参考资料:Computer Systems: A Programmer’s Perspective 3rd edition

亲爱的读者们,欢迎指正错误和提问。


http://chatgpt.dhexx.cn/article/dyYhk1LR.shtml

相关文章

【论文学习】7、ieee802.11ah中基于深度学习的载波频偏估计

摘要 基于ieee802.11标准的Wi-Fi系统是最流行的无线接口&#xff0c;它采用先听后讲&#xff08;LBT&#xff09;的方式进行信道接入。大多数基于LBT的系统的显著特征是&#xff0c;发射机使用在数据之前的前导码来允许接收机执行分组检测和载波频率偏移&#xff08;CFO&#…

计算机中的小数 IEEE754

计算机中的小数 IEEE754 进制计数系统 在基数b的位置记数系统(其中b是一个正自然数&#xff0c;叫做基数)&#xff0c;b个基本符号(或者叫数字)对应于包括0的最小b个自然数。 要产生其他的数&#xff0c;符号在数中的位置要被用到。最后一位的符号用它本身的值&#xff0c;向…

计算机组成原理:IEEE754标准中,为什么指数真值e变成阶码加上的偏移值是127不是128?

1.浮点数在计算机里的存储方式 以32位为例,短浮点型float,按照按照 IEEE754 标准,在计算机里的存储格式如下 数符S&#xff1a;表示浮点数的符号&#xff0c;占1位&#xff0c;0—正数、1—负数&#xff1b; 尾数M&#xff1a;23位&#xff0c;原码纯小数表示&#xff0c;小数…

ieee sci 期刊 写作经验 分享 博士发展阶段

0. 前言 本文仅记录最近我在论文写作中遇到的问题&#xff08;感谢老师、师兄的用心指导&#xff09;&#xff0c;仅仅是我的个人分享&#xff0c;不适用于所有人。 1. introduction - 如何切入自己的工作&#xff1f; 1.1 不要没事找事 例子&#xff1a; 比如你做的是目标…

谈谈论文的发表(电光与控制,IEEE ACCESS)

前言 目前&#xff0c;科研任务差不多告一段落&#xff0c;总结一下发表论文的经验以及经历。 2021年3月&#xff0c;录用IEEE ACCESS一篇&#xff0c;本来老师想让投IEEE trans系列&#xff0c;但是工作的深度差一点&#xff0c;并且没有很好的实例论证&#xff0c;只有仿真&…

IEEE 754标准

普通规则下: 移码: 补码的基础上将符号位取反。注意:移码只能用于表示整数 移码的定义: 移码 真值 偏置值(确定移码&#xff0c;首先要确定偏置值) 偏置值一般取2^n-1&#xff0c;此时移码 补码符号位取反 IEEE 754规则下&#xff1a; 偏置值 2^n-1 - 1 相当于将普通规…

IEEE 754浮点数工业标准

文章目录 浮点数概述浮点数的格式IEEE 754标准规定的浮点数的格式IEEE 754偏移量与指数范围问题IEEE 754中浮点数值的三种情况&#xff1a;1. 规格化的浮点数的值2. 非规格化的值3. 特殊值 Java中的浮点数类型 浮点数概述 浮点数&#xff0c;是属于有理数中某特定子集的数的数字…

SPSS Modeler导入excel文件时出现“无法读取文件列名”解决方法

SPSS Modeler导入excel文件时出现“无法读取文件列名”解决方法 经过本人多次尝试&#xff0c;终于发现了原因 原因是&#xff1a;excel文件在后台打开了&#xff0c;因此spss modeler读取不了 解决方法&#xff1a;关闭正在打开的该excel文件&#xff0c;再读取即可 如果解决了…

SPSS Modeler 数据导入操作

1、导入文本文件 数据选项卡&#xff0c;主要是指定所读取数据的基本类型&#xff0c;通常无需修改&#xff0c;若需修改要先在覆盖那里打钩&#xff0c;然后下拉存储框进行修改 过滤选项卡是选择读取数据时读取哪些数据&#xff0c;同时可以修改变量名。 类型选项卡是指定读取…

SPSS导入excel文件时,保留4位小数点

SPSS导入excel文件时&#xff0c;保留4位小数点 SPSS导入excel文件时&#xff0c;会只保留整数部分&#xff0c;而小数点部分的数据不显示&#xff0c;如下图&#xff1a; 我尝试在SPSS的变量视图里将小数点位数改成4位&#xff0c;如图&#xff0c;但是导入数据后&#xff0c…

SPSS for Mac导入Excel表格找不到文件、以及“文件受密码保护”报错问题的解决办法

SPSS版本25&#xff0c;在导入Excel文件时显示不出来&#xff0c;需要移动到磁盘-用户-apple里面&#xff0c;我这里是我自己的用户名&#xff0c;移进去就可以看到了 之后可以用导入文件打开&#xff0c;也可以直接拖到数据视图&#xff0c;但是我这边又出现了一个小问题 出现…

SPSS数据抽取

SPSS数据抽取 数据抽取一般分为两类&#xff1a;字段拆分和随机抽样 字段拆分 数据抽取&#xff0c;也称为数据拆分&#xff0c;是只保留原数据表中的某些字段、记录的部分信息&#xff0c;形成一个新字段、新记录。 在spss中导入我们需要的数据&#xff0c;变量主要包含如…

利用SPSS做数据分析②之数据处理1

SPSS数据处理有六个步骤&#xff0c;分别是&#xff1a; 数据导入数据清洗数据抽取数据合并数据分组数据标准化 数据处理是根据数据分析的目的&#xff0c;将收集到的数据&#xff0c;用适当的处理方法进行加工、整理&#xff0c;形成适合数据分析的要求样式&#xff0c;它是数…

SPSS怎么筛选无效数据

我们在用IBM SPSS进行数据分析的时候&#xff0c;经常会遇见这样一种情形&#xff0c;想把不符合自己分析要求的数据全部筛掉。我们把这些要筛掉的数据叫作无效数据&#xff0c;无效数据不筛选掉不但会降低分析的效率&#xff0c;而且会影响最终结果的准确性。 要想提高准确性…

SPSS学习笔记

什么都写 插入个案&#xff1a;指一行 插入变量&#xff1a;指一列 设置 语言 编辑->选项 语言中可以选择输出的语言和界面的语言 变量定义 左下角切换到变量视图&#xff0c;可以修改变量的属性 1.类型可选&#xff0c;注意会影响到后面测量中的选项&#xff0c;如…

SPSS数据插补方法

问题&#xff1a;ArcGIS多值提取至点的数据有很多缺失值 这是对多个区域分区统计后的结果&#xff0c;由于ET的质量不高&#xff0c;所以有很多缺失值 那么&#xff0c;怎样才能将这些值进行插补成我们认为可靠的格式呢&#xff1f; 第一步-将arcgis多值提取至点的数据整理成…

python数据导入spss_spss-数据抽取-拆分与合并

数据抽取也成为数据拆分&#xff0c;是指保留、抽取原数据表中某些字段、记录的部分信息&#xff0c;形成一个新字段、新纪录。分为&#xff1a;字段拆分和随机抽样两种方法。 一&#xff1a;字段拆分 如何提取“身份证号码”字段。身份证号码里面包含了许多信息&#xff0c;…

SPSS数据清洗

SPSS数据清洗 关于spss对数据的清洗&#xff0c;就是将多余重复的数据筛选清楚&#xff0c;将确实的数据补充完整&#xff0c;将错误的数据纠正活删除。 下面主要内容是关于最常用的重复数据操作&#xff1a; 首先在spss中导入需要去重的数据&#xff1a; 选择数据菜单&…

SPSS读取数据文件

1.读取Excel数据文件 &#xff08;1&#xff09;选择“文件”-“打开”-“数据”,在弹出的“打开数据”对话框下选择Excel文件&#xff0c;如图所示 &#xff08;2&#xff09;选择要打开的Excel文件&#xff0c;点击“打开”&#xff0c;如图所示 &#xff08;3&#xff09;可…

SPSS读取数据出现中文字符显示乱码的解决方案

在打开数据标签中含有中文字符的SPSS数据文件时&#xff0c;由于编码问题有时会出现乱码的状况。譬如下图&#xff1b;但是尝试过单纯修改字符的字体之后并未能解决乱码问题。但值得注意的是&#xff0c;本人在打开文件的时候spss提示由于字符的长度等因素&#xff0c;因此需要…