浮点数的表示与运算
浮点数的表示【科学记数法】
-
- 表示格式
- 阶码
- 尾数
- 表示格式
-
- 规格化
- 定义:存储空间不变的情况下让尾数的精度变高【科学记数法】
- 规范【机器小数点不能移动,所以这里是数值的移动】
- 左规:尾数左移,阶码 - 1
- 右规:尾数右移,阶码 + 1
- 原码规格化
- 无效位是0
- 补码规格化
- 规定规格化后,符号位和数值位不一样,方便计算机判断
- 正数 0,1XXXXX
- 负数【补码】 1,0XXXXX,例如:0110 | 1,1010,
- 尾数 1.101 的数值位左规【因为这里原码:1,011,前面的1是无效位】,变成0.0100,
- 阶码-1,0101
- 最后:0101 | 1,0100
- 规定规格化后,符号位和数值位不一样,方便计算机判断
- 规格化
-
- 表示范围
- 负上溢(【-1】----【-> -1/2】)负下溢--0--正下溢(【1/2】----【-> 1】)正上溢
- 正负上溢
- 必须中断程序
- 正负下溢
- 浮点数趋于0,机器当0处理
- 表示范围
IEEE754标准
-
- 概念
- 数符:符号位
- 阶码:用 “ 移码 ”表示
- 移码:补码,翻转符号位
- -128: 0,000 0000
- -127: 0,000 0001
- “ 移码 ” :真值 + 偏置值(定义为127D:0111 1111B)
- -128: 1,111 1111
- 尾数全0:正负 无穷,看符号位
- 尾数全1:代表NaN,非法数值(1/0之类的)
- -127: 0,000 0000
- 尾数全0:代表 正负 0,看符号位
- 尾数不全0:代表非规格化小数,0.0101... × 2^-126
- -128: 1,111 1111
- 移码:补码,翻转符号位
- 尾数:用原码表示
- 例子:
- 概念
-
-
- 真值 转 IEEE754
- 写符号位
- 尾数 1.X,X就是要写进去的尾数
- 阶码真值S,
- S + 127(偏移量),计算放进去的阶码
- 转为二进制
- 符号位 + 阶码的移码 + X
- IEEE754 转 真值
- 展开成二进制
- 符号位
- 阶码S
- 真值 = S - 0111 1111B = S + (1000 0001)
- 尾数:0.X,加上 1,变成1.X
- 计算
- 真值 转 IEEE754
- 强制类型转换【IEEE754】
- 例子
- 32 int 转 32 float,精度损失,范围不溢出
- 因为 32位 int 是1 + 31,
- 32位float 是 1+8+(23+1)
- float -> int ,精度损失(0.000111,转int,直接为0),范围损失
- 32 int 转 32 float,精度损失,范围不溢出
- 例子
-
-
-
- a
- 浮点数的运算【用双补码的科学记数,不用IEEE754】
- 对齐阶码
- 尾数加减
- 规格化
- 舍入【类比4舍5入】
- 0舍,1入
- 恒1法
- 溢出
- 阶码溢出,真溢出
- 尾数溢出,采用双符号位可以帮助纠正
-
-
-
-
- a
-
-
算术逻辑单元
1、串行加法器与并行加法器
- ALU结构
- 一位全加器【CLA】
- 一个算数逻辑单元
- 串行加法器
- 将算数逻辑单元,串联在一起,只有前置单元计算结束,后继单元才能继续
- 并行加法器
- 如下图,
- 每个逻辑单元计算时,都需要前置单元所有的Gi,Pi,将这些数都并联在算术逻辑单元上,就能近似的实现同步运算【4个为1组】,组内并行,组间串行
- 并行优化
- 在上述基础上,将组内的Gi* 和 Pi* 也与其他组并联,近似实现组间并行
2、ALU的功能与结构