浮点数的表示_IEEE 754
IEEE 754 标准的浮点数格式
啥玩意是IEEE?答案就是电气电子工程师学会(Institute of Electrical and Electronics Engineers),简称IEEE。
IEEE 754:由IEEE指定的二进制浮点数算术标准,规定了在计算机内部,如何使用二进制表示和运算符点数。主流的编程语言如C的float 32bit 单精度浮点型和double 64bit 双精度浮点型就是符合IEEE 754标准的浮点数格式。在考研上只用IEEE 754表示浮点数。

定点数的局限性
比如302657264526,我们用4Byte的定点整数int是表示不了的,虽然我们可以用8Byte,但是不能解决所有问题。计算机的机器字长位数有限,我们不能无限制地增加数据的长度。那么我们怎么在位数不变的情况下增加数据表示范围呢?
从科学计数法理解浮点数

我们普通计法转换为科学计法的时候,是允许丢失一些数据的。
- 尾数:尾数反映了实际的值是多少,以及尾数的位数会影响精度。
- 基数:跟进制有关。
- 阶码:小数点应该移动几位。
我们不仅可以用于超级大的值,也可以用于超级小的值,但是记住规格化:”确保尾数的最高位非0数位刚好在小数点之前“。

那么我们这个可不可以用于二进制呢?当然可以得啦ヽ(✿゚▽゚)ノ

IEEE 754 标准定义的浮点数格式


我们的基数2去哪了?二进制肯定为2啊kuso!!!尾数代表了精度,我们可以看出来double型的精度比float型要高。
float单精度浮点型的存储

double 双精度浮点型的存储

求 8 位移码(两种方法都验证)
方法一:移码定义法(最根本)
移码 = 真值 + 偏置值(单精度偏置值 = 127)
移码数值12910=2+127=129=100000012
→ 8 位移码:1000 0001
方法二:补码符号位取反法(快捷方式)
移码 = 补码仅符号位取反,其余位不变
- 补码:
0000 0010 - 符号位 0→1,其余位不动 →
1000 0010
IEEE 754浮点数 表示范围&几种特殊状态
由于本章节太多二进制,所以大多采取使用截图方式进行,请准备好魔法再来观看⚠
IEEE 754规定
当且仅当阶码不全为0,也不全为1时,表示这是一个”规格化浮点数“
阶码全为0、全为1留作特殊用途,需要按照特殊的方式去解读真值。

仔细想想为什么要用移码表示,你会发现这样巧妙的让从0000 00001开始 直到1111 11110 这是从小到大的规律!

IEEE 754 浮点数的上溢
关于溢出判断的笔记还真是不好记忆,但是我们要记住。阶码那里为什么要用补码表示,是为了从0000 0001开始是最小负数,1111 1110 是最大正数。记住这里,回忆过往,这道题大概率就可以解出来。

浮点数上溢出的处理:
- 浮点数运算部件将运算结果设为正无穷或者负无穷
- 设置浮点数溢出异常标志位(例如:x86会将浮点运算单元FPU的OE的标志位Overflow Exception设为1)
注:IEEE 754规定,默认不响应浮点数溢出异常不中断程序;除非程序员手动开启此类异常响应。
1 |
|
这是两个上限的值相加,我们会发现最终结果为inf,而inf的意思正为无限。如果我们不手动捕捉的话,还会继续向下运行代码。
浮点数下溢出的处理:
- 若结果落入非规格化区间->用非规格化浮点数存储;若结果太小(真值逼近于0)->按机器零存储。
- 若下溢至机器零,设置浮点数下溢异常标志位(例如:x86会将浮点运算单元FPU的OE的标志位Overflow Exception设为1)
注:IEEE 754规定,默认不响应浮点数溢出异常不中断程序;除非程序员手动开启此类异常响应。




注意,当阶码全是零的时候,小数点前面不是1,而是0。并且不可以将阶码解读为0-127=-127,而是固定解读为阶码的最小真值为0

- 在IEEE 754浮点数表示中:NaN代表“不是一个数”(Not a Number)
- 并且IEEE 754规定,非零数值除以0,结果是无穷的,0除以0的结果是NaN
浮点数的加减运算
IEEE 754下的浮点数运算其实和十进制的运算一模一样。我们直接来做一道例题的:

- 对阶:小阶向大阶靠齐,$X_阶-Y_阶=1$,说明Y的阶码更小,应将Y的尾数后移1位,阶码对齐。

- 尾数加减(原码的加减运算):

- 尾数规格化:

- 尾数的舍入处理:

- 溢出判断:阶码不全为1、也不全为0,说明未发生上溢、下溢:

IEEE 754的最常用舍入模式
就近舍入(类似“0舍1入”):IEEE默认舍入模式。类似“0舍1入”。如果3个舍弃位刚好是100,则1+23bit尾数的末位是0,直接截断多余位即可;若1+23bit尾数的末位为1,则截断多余位,并在“末尾加一”

0xx舍

1x1 11x 111入

100问题


数据的存储和排列
大小端模式
多字节数据在内存里一定是占连续几个字节的。举个例子,我们来看一下:

比如说这里占四字节的int变量:
- 最高有效字节(MSB):也就是
01 - 最低有效字节(LSB):也就是
67
而我们要存储这些多字节连续数据的话,一般会采用大小端的方式来存储:

上面的0800H…等是内存地址,从图上我们可以得出两种: - 大端方式:从LSB到MSB,这是符合人类阅读习惯的
- 小端方式:从MSB到LSB,也就是大端倒过来,虽然不太适合人类阅读,但是更适合机器处理
为什么小端适合机器读入呢?举个例子。CPU读取内存的方式也是从地位0800H到0803H,假如我们现在要进行两个int变量进行相加,肯定是要从LSB开始也就是低位相加的,这样才能进1。
边界对齐
现代计算机通常是按字节编址,即每个字节对应1个地址。通常也支持按字、按半字、按字节寻址。假设存储字节长为32位,则1个字=32bit,半字=16bit。每次访存只能读/写一个字

说些什么吧!