浮点数的表示与运算
浮点数的表示
1. 浮点数的表示格式
通常浮点数表示为:
S取0或1,代表的是浮点数的符号
M是一个二进制定点小数,叫做尾数,一般用定点原码小数表示
R是二进制定点整数,称作阶码或指数,用移码表述
E是基数
可见:浮点数是由符号,尾数和阶码组成
32位短浮点数的表示格式
阶码的值反应浮点数的小数点的实际位置,尾码的位数反应浮点数的精度
2. 浮点数的表示范围
3. 浮点数的规格化⭐⭐⭐
规格化操作就是通过调整一个非规格化数的尾数和阶码的大小,使得非零浮点数在尾数的最高数位上保证是一个有效值。
左规:当运算结果的尾数的最高位数不是有效位,即出现+-0.0……的形式,需要进行左规,左规一次,阶码减一。
右规:当运算结果的尾数的有效位近到小数点前边时,要进行右规。右规一次,阶码加一。
阶码为2时的原码规格化尾数M应满足的条件:
1.正数为0.1x...x的形式,最大值为0.11...1,最小值为0.100..00
2.负数为1.1x...x的形式,最大值为1.10...0,最小值为1.111..11
阶码为4时为高两位不全为0
补码的规格化要求符号位和次符号位不一致
eg:详情见王道习题
4. IEEE 754标准⭐⭐⭐⭐
IEEE754标准的浮点数格式
64位和32位的区别在于64位浮点数的阶码11位,尾数52位。而32位的阶码8位,尾数23位
注意!!!我们需要知道,IEEE754标准中对于规格化的尾数,他的最高位永远是1,所以为了提供更高的精准度,这个1被隐藏掉,称为隐藏位。
例如:12的二进制数是1100,把它变成浮点数是1.1×2^3次方,其中小数点左边的1不被存储在IEEE754中,因为大家默认这个一是存在的。
注意!!!在IEEE754标准中,移码的偏移值不是2^n-1次方,而是(2^n-1次方)-1
直接给出实例:1.1×2^3次方,在单精度浮点数的表示中,阶码为3+127=130(82H),在双精度的浮点数表示中,阶码为3+1023=1026(402H)
规格化单精度浮点数的真值表示范围:
规格化双精度浮点数的真值表示范围:
我们需要知道的前置知识点是:在IEEE754的格式中,阶码全0或者全1,有着其他的解释,所以在我们最大值和最小值的考虑中,不去考虑全0或者全1的情况。
根据这两个公式理解上述最小值和最大值
在要求阶码不全为0和1的情况下:(只考虑32位,64位类似)
最小值:阶码为1,尾数全为0,加上隐藏位也就是尾数为1.0.那么真值就是
最大值:阶码为1111 1110,即254,尾数全为1,加上隐藏位就是1.1111111,那么真值
计算二进制数1.111...111:23位小数的和为等比数列求和结果是
,所以结果就是
那么我们开始解释前边挖的小坑,当阶码全是0或者全是1时代表什么呢?直接copy王道课本的解释。
OK!!!我们进入例题的步骤,转换十进制数为IEEE754以及转换IEEE754为十进制数
首先:将是十进制数-8.25转换成IEEE 754单精度浮点数
- 首先将十进制数变为二进制数:-1000.01,将其变为规格化数字1.00001×2的3次方
- 阶码为3+127=130,转换成8位2进制数10000010
- 符号位为1
- 尾数为.00001,不够23位,补0
- 故结果是 1100 0001 0000 0100 0000 0000 0000 0000
- 即C1040000H
再来:将IEEE754数C640 0000H变为十进制数
- 首先将IEEE754数变为2进制数: 1100 0110 0100 0000 0000 0000 0000 0000
- 将其分类 1 1000 1100 1000 0000 0000 0000 0000 000
- 1说明他是负数
- 1000 1100的十进制数是140 140-127=13,也就是阶码位13
- 1.1000 0000 0000 0000 0000 000 的十进制数是1.5
- 那么结果就是
浮点数的加减运算
注意!!!浮点数的加减运算是阶码的运算和尾数的运算分开进行,步骤如下
1.对阶
当加减的两个浮点数阶码不相同时,就无法进行运算,所以我们要先将阶码进行对阶。对阶时要遵循小阶码向大阶码看齐。个人理解如下:与其考虑二进制数的对阶,不如将二进制数变成十进制数考虑。计算得出相差的值,当然如果你可以认清二进制数的对阶当我没说。
为什么不可以大阶码向小阶码看?
因为大变小的话,就要左移,那么最高位就会被移出,ERROR
2.尾数加减
将对阶后的尾数按定点原码小数的加减运算。注意要将隐藏位移出。运算结果可能是不规格化的,要通过后续操作将其变为规格化数。
3.尾数规格化
- 右规
当结果是1x.xxxx时,要进行右规。尾数右移1位,阶码加一
- 左规
当结果是0.000001x..x时,要进行左规,直到1移到小数点左边。
4.舍入
在对阶和右规时都有可能进行舍入操作!!!并且舍入后还要考虑是否需要继续规格化
四种舍入方式:
- 就近舍入,即0舍1入
- 正向舍入,向+无穷的方向舍入
- 负向舍入,向-无穷的方向舍入
- 截断,即丢弃后边所有的位数
5.溢出
在IEEE 754 中判断溢出不是观察尾数,而是观察阶码,因为不管尾数如何溢出,我们都可以通过规格化将其变得不溢出,但是只有阶码都溢出之后才是真的溢出。
正指数超过最大值,127或1023就是指数上溢。
负指数超过最小值,-149或-1074就是指数下溢。 0.00..01
C语言中的浮点数类型
char——int——long——double
float——double
int——float时不会发生溢出,但是当int的24-31位不是0时就会被影响精度
int/float——double,不会影响精度
double——float,会影响精度
float/double——int,有可能发生溢出
这方便的知识点我们通过习题来理解
数据的大小端和对齐方式
由于在存储数据时数据可以从左到右也可以从右到左排列,所以我们只能用LSB(最低有效字节)和MSB(最高有效字节)来表示低位和高位。
01 23 45 67H MSB为01H LSB为67H
大端存储
即先存储高位字节,再存储低位字节
01 23 45 67
小端存储
即先存储低位字节,再存储高位字节
67 45 23 01
边界对齐方式
边界对齐方式要求存储地址是自身大小的整数倍
半字是2的整数倍
字是4的整数倍、