浮点表示:
V∈R,V=x×2y通常∣V∣>>0或者∣V∣<<0
2.4.1 二进制小数
di∈(0~9),⇓d=dmdm−1⋅⋅⋅d1d0.d−1d−2⋅⋅⋅d−n=i=−n∑m10i×die.g.:12.3410=1×101+2×100+3×10−1+4×10−2=1210034⟹bi∈{0,1},⇓b=bmbm−1⋅⋅⋅b1b0.b−1b−2⋅⋅⋅b−n=i=−n∑m2i×bi(2.19)e.g.:101.112=1×22+0×21+1×20+1×10−1+1×10−2=543
二进制表示的局限性
无法精确的表示一些数字。例如,0.20的表示如下:
IEEE 浮点表示
IEEE浮点标准用
V=(−1)s×M×2E符号(sign) 尾数(significand)阶码(exponent)一个单独的符号位s直接编码符号sk位的阶码字段exp=ek−1⋅⋅⋅e1e0编码阶码E。n位小数字段frac=fn−1⋅⋅⋅f1f0编码尾数M。e.g.:单精度(float):s=1,exp=k=8,frac=n=23⟹32位表示双精度(double):s=1,exp=k=11,frac=n=52⟹64位表示s决定正负。数值0作特殊情况处理。M是二进制小数,M∈[1~2−ϵ]∣∣[0~1−ϵ]E对浮点数加权,可能是负数。
根据exp
的值,被编码的值分三种情况。
情况1:规格化的值exp位模式不全为0也不全为1:E=e−Bias,e为无符号数,e=ek−1⋅⋅⋅e1e0,Bias=2k−1−1frac⟹f,f∈[0,1)⟹0.fn−1⋅⋅⋅f1f0,M=1+f情况2:非规格化的值阶码域全为0⟹E=1−Bias,M=f。情况3:特殊值阶码全为1⟹小数域全为0=⎩⎨⎧s=0,s=1,+∞−∞小数域为非零=NaNe.g.:
1.值+0.0⟹02.最小正非规格化值的位表示:M=f=2−n,E=1−(2k−1−1)=−2k−1+2⟹V=2−n−2k−1+23.最大非规格化值的位表示:M=f=1−2−n,E=1−(2k−1−1)=−2k−1+2⟹V=(1−2−n)×2−2k−1+2=(1−ϵ)×2−2k−1+24.最小正规格化值的位表示:M=1,E=1−(2k−1−1)=−2k−1+2⟹V=2−2k−1+25.值1.0,M=1,E=0,V=20=16.最大规格化值的位表示:f=1−2−n,M=2−2−n,E=2k−1−1⟹V=2−2−n×22k−1−1=(2−ϵ)×22k−1−1=(1−2−n−1)×22k−1e.g.:整数值转换成IEEE浮点表示0×00359141=[00000000001101011001000101000001]0×00359141<<21=1.1010110010001010000012×221去掉最高有效位,末尾补0凑成23位⇓[10101100100010100000100]21+Bias=21+28−1−1=148=[10010100]补上符号位0⇓⟹[01001010010101100100010100000100]=0×4A564504数据比对⇓
0x00359141 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
|
|
0x4A564504 |
|
|
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
2.4.4 舍入(rounding)
IEEE
浮点格式定义了四种舍入方式。
方式 |
1.40 |
1.60 |
1.50 |
2.50 |
-1.50 |
向偶数舍入 |
1 |
2 |
2 |
2 |
-2 |
向零舍入 |
1 |
1 |
1 |
2 |
-1 |
向下舍入 |
1 |
1 |
1 |
2 |
-2 |
向上舍入 |
2 |
2 |
2 |
3 |
-1 |
向零舍入→0向下舍入↓向上舍入↑特别地:(没搞懂。。。)1.2349999⟹1.231.2350001⟹1.241.2450000和1.2350000⟹1.24形如XX⋅⋅⋅X.YY⋅⋅⋅Y100⋅⋅⋅的二进制位模式,X和Y为任意值⇓10.000112(2323)↓⟹10.002(2)10.001102(2163)↑⟹10.012(241)10.111002(287)↑⟹11.002(3)10.101002(285)↓⟹10.102(221)∣x^∣≤∣x∣x−≤xx≤x+