2.3 浮点数的表示和运算

游戏攻略87542025-10-27 03:25:14

2.3.1 浮点数的表示

1、浮点数的表示

浮点数通常表示为:

N=rE×MN=rE×M

r:阶码的底,通常为2E:阶码,反映浮点数的表示范围和小数点的实际位置,用补码或移码表示M:尾数,其位数反映了小数的精度,用原码或补码表示

例:阶码和尾数都用补码表示,求a、b的真值

a = 0,01; 1.1001b = 0,01; 0.01001a:

阶码0,01对应真值+1尾数0.1001对应真值-0.0111,也可看作-111右移四位:−724−247​故a=21×(−724)=−78a=21×(−247​)=−87​b:

阶码对应真值+1尾数0.01001对应真值+0.01001,也可看作+1001右移五位:+925+259​故b=21×925=916b=21×259​=169​

2、浮点数的规格化

规定尾数的最高位必须是一个有效值。

左规:当浮点数运算的结果为非规格化时要进行规格化处理,将尾数左移一位,阶码减1 ( 基数为2时):

001; 00100(1)=21×(+0.01001)21×(+0.01001)-->20×(+0.10010)20×(+0.10010)= 000; 01001(0)

右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10)时,将尾数右移一位,阶码加1 (基数为2时)。

例:a=010; 00.1100;b = 010; 00.1000,求a+b

a=22×00.1100b=22×00.1000a+b=22×(00.1100+00.1000)=22×01.0100(发生溢出)=23×00.1010a=22×00.1100b=22×00.1000a+b​=22×(00.1100+00.1000)=22×01.0100(发生溢出)=23×00.1010​​

规格化后的尾数满足:1r≤∣M∣≤1r1​≤∣M∣≤1

规格化的目的:增加数据表示的精度

3、IEEE 754 标准

尾数前隐含一位1

类型数阶阶码尾数数值总位数偏置值短浮点数1823327FH(127)长浮点数11152643FFH(1023)临时浮点数11564803FFFH规格化的短浮点数的真值为:(−1)S×1.M×2E−127(−1)S×1.M×2E−127;规格化的长浮点数的真值为:(−1)S×1.M×2E−1023(−1)S×1.M×2E−1023。对于短浮点数而言,偏置值取127,此时阶码(移码)的表示范围为**-126~127**:

真值补码移码-128*1000 00001111 1111-127*1000 00010000 0000-1261000 00100000 0001………………00000 00000111 1111………………1270111 11111111 1110-128和-127的作用:

E=0E=0且M=0M=0,则真值为0;E=0E=0且M≠0M=0,为非规格化数,真值=(−1)S×0.M×2−126=(−1)S×0.M×2−126;E=255E=255且M≠0M=0,真值为‘NaN’(非数值);E=255E=255且M=0M=0,真值为正或负无穷。

例:将 -0.75D 转换为IEEE 754 的单精度浮点数格式表示

将十进制转化为二进制

−0.75D=−0.11B−0.75D=−0.11B

将小数的高位变为1 (对应尾数隐含的1)

−0.11=−(1.1)2×2−1−0.11=−(1.1)2​×2−1

数符:1

尾数:取小数点后面部分,并补0

.1000 0000 0000 0000 0000 000

阶码:真值+偏移量

(−1+127)D=126D=01111110B(−1+127)D=126D=01111110B

结果:1 0111 1110 1000 0000 0000 0000 0000 000

例:IEEE 754的单精度浮点数 C0 A0 00 00 H的值是多少

化为二进制

1100 0000 1010 0000 0000 0000 0000 0000数符:1阶码:1000 0001尾数:0100 0000 0000 0000 0000 000尾数:加上隐含的1

(1.01)2(1.01)2​阶码

先看作无符号数:1000 0001B = 129D移码-偏置值:129-127=2真值:−(1.01)2×22=−(1.25)10×22=−5.0−(1.01)2​×22=−(1.25)10​×22=−5.0

2.3.2 浮点数的运算

1、加减运算

步骤:

对阶尾数加减规格化舍入判溢出

例:已知十进制数X=−5256X=−2565​、Y=+591024Y=+102459​,按机器补码浮点运算规则计算X-Y,结果用二进制表示,浮点数格式如下:阶符取2位,阶码取3位,数符取2位,尾数取9位

5D=101B,1256=2−8X=−101×2−8=−0.101×2−5D=−0.101×2−1015D=101B,2561​=2−8X​=−101×2−8=−0.101×2−5D=−0.101×2−101​​

阶码

-101,补码为:1011阶符取两位、阶码取三位:11011尾数

-0.101,补码为1.011数符取两位,尾数取九位:11.011000000可得X:11011;11.011000000同理:59D=111011B,11024=2−10Y=+111011×2−10=+0.111011×2−4D=+0.111011×2−10059D=111011B,10241​=2−10Y​=+111011×2−10=+0.111011×2−4D=+0.111011×2−100​​

阶码

-100,补码为1100阶符取两位、阶码取三位:11100尾数

+0.111011,补码为0.111011数符取两位,尾数取九位:00.111011000

(1)对阶

使两个数的阶码相等,小阶向大阶看齐,尾数每右移一位,阶码加1。

[ΔE]补=11011−11100=11011+00100=11111[ΔE]补​=11011−11100=11011+00100=11111

11111为-1的补码,故ΔE=−1ΔE=−1,X的阶码比Y的阶码小1

阶码每加1,尾数右移一位,则有新的X:11100;11.101100000(右移之后前面补1)

此时,X=−0.0101×2−100X=−0.0101×2−100

(2)尾数相加减

首先有 -Y= 11100;11.000101000

尾数相加,得:

11.101100000+11.00010100010.11000100011.101100000+11.00010100010.110001000​​

相当于提取公因式

(3)规格化

由于上一步发生了溢出,因此需要右规

尾数右移一位,阶码加1,得:X-Y=11101;11.011000100

(4)舍入

{% hint style=“info” %}“0”舍“1”入法:类似于十进制数运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1, 则在尾数的末位加1。这样做可能会使尾数又溢出,此时需再做一次右规。

恒置“1”法:尾数右移时,不论丢掉的最高数值位是“1”还是“0”, 都使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。

{% endhint %}

无舍入

(5)判断溢出

未发生溢出

结果真值为2−3×(−0.1001111)22−3×(−0.1001111)2​

2、强制类型转换

数据类型16位机器32位机器64位机器char888short161616int163232long323264long long646464float163232double646464char --> int --> long --> double 以及 float --> double,不会损失精度。

对于32位系统:

int:表示整数,范围为−231∼231−1−231∼231−1,有效数字32位float:表示整数及小数,范围±[2−126∼2127×(2−2−23)]±[2−126∼2127×(2−2−23)],有效数字23+1=24位int --> float:可能损失精度(有效数字比float多)float --> int:可能溢出(超出int表示范围)及损失精度(小数部分)

JPG转PDF转换器
联想电脑蓝屏无法正常启动怎么恢复?四种方法完美解决!