一:二进制定点法
如:0.011 那么它表示1/8+2/8=3/8;
可以看出它并不能精确地表示每一个小数值,在不提高位的情况下只能尽量选择最接近的值。比如1/5,十进制可以表示为0.2,但2进制不能精确表示。
二:IEEE浮点法:
公式:v=(-1)^s*M*(2^E);
v表示数值。
s表示符号,s=0时为正,s=1时为负。
M表示表示尾数,当为非规格化时,M=f,当为规格化时M=f+1;
E为阶码;
对于一个阶码位是k,尾数位为n的数有以下情形:
1.规格化时(即k位不全为0和全为1):
阶码 E=e-bias; 其中e表示为k位无符号整数,bias表示偏量 bias=2^(k-1)-1;
尾数 M=1+f; 其中f为小数。
2.非规格化时(即k位全为0的情况):
阶码 E=1-bias; 注:这样表示的原因是为了和规格化所表示的数平滑连接
尾数 M=f;
3.特殊值(即k为全为1的情况):
这种情况下又分三种特殊值:
当小数位全为0的时候,它的数值表示无穷大(小);
当小数位不全为0的时候,它表示为NaN(not a number);
实例:
假设有一个用8个位来表达的IEEE数,其中符号位占1位,阶码位占4位,小数位占3位
0 0000 000 那么可以得出k=4;n=3 bias=2^(k-1)-1=7;
那么0 01001 101所表达的值可以这样计算:
e=01001=9 -> E=e-bias=9-7=2;
f=0.101=5/8 ->(规格化)M=1+f=1+5/8=13/8;
根据公式v=(-1)^s*M*(2^E):
可得 V=1*(13/8)*2^2=6.25.