目录
5.1浮点数的表示格式
阶码:常用补码或移码来表示的定点整数。
尾数:常用原码或补码来表示的定点小数。
假设阶码为E,尾数为M,则
5.2浮点数的规格化
规格化浮点数:规定尾数的最高数值位必须是个有效值。采用规格化是为了增加数据的表示精度。
左规是为了保证尾数有更多的有效位,即有更高的精度。
当运算结果的有效位进到小数点前面时(精度严重丢失)进行右规。
规格化浮点数后尾数的表示范围:
上面规格化举例的前提是基数为2,当基数为4时,我们规定是小数点后两位必须是有效的。
5.3 IEEE 754标准
之前我们得到移码是通过“补码符号位取反”,这是在偏置值为2^n-1时成立。
移码的定义:移码=真值+偏置值
IEEE 754标准中偏置值为2^n-1-1
IEEE 754标准:
由于规格化的尾数部分是由原码表示的,其最高位一定是一个1,我们没必要让它占一个位置了,IEEE 754标准就默认尾数的小数点前面是一个数值1(不是符号位,符号位是最前面那个数符)。
比如尾数数值位是一个23位的“.48421...”,其实它保存的是绝对值“1.48421...”共24位数值位。
下面这里的E是移码的真值,对于8位阶码,它的真值范围是1~254(255,和0我们有其他用途)
对于double类型的11位阶码,它的真值范围是1~2046(2047,和0我们有其他用途)
下面是阶码全0和阶码全1时的特殊规定:
5.4浮点数的加减运算
有以下五个步骤:
- 对阶
- 尾数加减运算
- 规格化
- 舍入
- 判溢出
1.对阶:"小阶向大阶"靠齐,所以我们对阶码小的浮点数的尾数右移。
这一步选项出现尾数左移必错,同时这一步不会溢出。
2.尾数相减运算:这一步可能会出现溢出现象,我们只管补码加减即可。(原码加减也可,不同的码机器有不同的运算电路,我们只需保证真值是正确的。)
3.规格化:我们上一步得到运算结果需要进行规格化,注意上一步如果尾数溢出了,这一步进行右规即可拯救。
此外还要左规的情况,进行左规即可。
4.舍入:我们在对阶和规格化进行右规后把低位给舍弃了。上述例子最后一位是0,无影响,但如果舍弃的是1,精度会发生变化。
因此我们将低位移出的位值保留下来,在这一步对结果进行舍入。有下面的舍入方法:
5.判溢出:在进行尾数规格化和尾数舍入时,可能会对结果的阶码执行加减运算,因此我们最后一步判断阶码是否因为右规和尾数舍入发生了上溢和左规发生了下溢
5.5 C语言中的浮点数类型
char 8位
short 16位
int 32位
long 32位(32位机器)64位(64位机器)
float 32位 8位阶码 23位尾数数值
double 64位 11位阶码 52位尾数数值
- float 转换为 int 时可能会丢失精度(给出 int 的值时可以判断是否丢失精度,如果int表示的数只用10位就可以表示,那么float的23位一定也可以准确表示)
- double 和 float 做加减运算时需要对阶,float的尾数的有效位可能会被完全舍弃,这时得不到准确的结果。
- (float/double)转整型数(int)小数部分直接舍弃。
6.0 第二章小结
- 一般题目给出的都是十六进制表示的机器数,我们这时要把1位快速展开为4位进行原码补码的相关计算。如oxFCDE1248=1111 1100 1101 1110 0001 0010 0100 1000
- 8421码是二进制编码的十进制数。
- C语言的数据在内存中为补码形式。
采用边界对齐时,地址要能整除变量字节数:
如oxC00D不能存放short型(2字节),直到oxC00E才开始存放这个short型。
oxC002不能存放int型(4字节),直到oxC004才开始存放这个int型。
判断乘法溢出时不要用计算机的方法计算,吃力不讨好。可直接拿真值去计算,判断真值在不在寄存器的表示范围。
浮点数的尾数用补码表示时规格化是1.0XXXXX的形式。
IEEE 754标准中,单精度阶码为8位,偏置值为127;双精度阶码为11位,偏置值为1023。