将该数字乘以2,取出整数部分作为二进制表示的第1位;然后再将小数部分乘以2,将得到的整数部分作为二进制表示的第2位;以此类推,直到小数部分为0。
0.7 * 2 = 1.4 ——————- 1
0.4 * 2 = 0.8 ——————- 0
0.8 * 2 = 1.6 ——————- 1
0.6 * 2 = 1.2 ——————- 1
0.2 * 2 = 0.4 ——————- 0
0.4 * 2 = 0.8 ——————- 0
0.8 * 2 = 1.6 ——————- 1
0.6 * 2 = 1.2 ——————- 1
0.2 * 2 = 0.4 ——————- 0
…………
0.710=0.10110˙0˙1˙1˙20.7_{10}=0.1 0 1 1 \dot 0 \dot 0 \dot 1 \dot 1_{2}0.710=0.10110˙0˙1˙1˙2
浮点数在计算机中表示
计算机内存是有限的,也就是说无法准确的表示无理数以及无限循环小数(可以用分数的形式来表示).
浮点的意思是小数点的位置是可以变化的
IEEE浮点标准用V=(−1)s×M×2E,表示一个数IEEE浮点标准用 V = (-1)^s \times M \times 2^E,表示一个数IEEE浮点标准用V=(−1)s×M×2E,表示一个数
s:符号位
M:尾数
E:阶码
Bias:偏置值,用来计算阶码
Bias=2exp位数−1−1Bias = 2^{exp位数 - 1} - 1Bias=2exp位数−1−1,下面例子Bias=22−1−1=1Bias = 2 ^{2-1} - 1=1Bias=22−1−1=1
假设浮点数只有5位(1位符号位,2位exp,2位尾数)
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
s | 0 | 0 | 0 | 0 |
第1位 为符号位, 0 表示 +, 1 表示 -
第2-3位 为exp
第4-5位 为尾数(这是实际的数据,位数越多,越精确,这是罪恶之源)
float ,32位, 由 1位符号位 8位exp 23位尾数 组成
223=8,388,6082^{23} = 8,388,608223=8,388,608,所以最多只能精确表示7位的十进制
double, 64位, 由1位符号位 11位exp 52位尾数 组成
252=4,503,599,627,370,4962^{52} = 4,503,599,627,370,496252=4,503,599,627,370,496,所以最多只能精确表示16位的十进制
1.非规格化: 阶码全0
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
s | 0 | 0 | x | x |
E=1−BiasE = 1 - BiasE=1−Bias
只有小数
2.规格化: exp在 全0 与 全1 之间(不包括全0,1)
E=e−BiasE = e - BiasE=e−Bias
隐含1
3.无穷大: exp全1,并且尾数全0
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
s | 1 | 1 | 0 | 0 |
4.NaN:exp全1,并且尾数不全是0
下面是浮点数的计算
e: exp 对应的数值(无符号数)
f:小数值
1 | 2 | 3 | 4 | 5 | e | E | 2E2^E2E | f | M | V | 十进制 |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 14\cfrac{1}{4}41 | 14\cfrac{1}{4}41 | 14\cfrac{1}{4}41 | 0.25 |
0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 12\cfrac{1}{2}21 | 12\cfrac{1}{2}21 | 12\cfrac{1}{2}21 | 0.5 |
0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 34\cfrac{3}{4}43 | 34\cfrac{3}{4}43 | 34\cfrac{3}{4}43 | 0.75 |
0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 |
0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 14\cfrac{1}{4}41 | 54\cfrac{5}{4}45 | 54\cfrac{5}{4}45 | 1.25 |
…