小数的表示分为「定点法」和「浮点法」
1 定点法,定点数
定点法就是小数是预先约定好的
举个例子
(1)二进制转十进制
二进制
101.011
转化为十进制101.011 101.011 101.011
= ( 1 ∗ 2 0 + 0 ∗ 2 1 + 1 ∗ 2 2 ) + ( 0 ∗ 2 − 1 + 1 ∗ 2 − 2 + 1 ∗ 2 − 3 ) = (1*2^0 + 0*2^1 + 1*2^2)+(0*2^{-1} + 1*2^{-2} + 1*2^-3) =(1∗20+0∗21+1∗22)+(0∗2−1+1∗2−2+1∗2−3)
= 5 + 0.375 =5+0.375 =5+0.375
= 5.375 = 5.375 =5.375
(2)十进制转二进制
我们要将 10 进制的 5.375 转化为二进制
首先转化整数部分,很简单,就是
101
然后是小数部分,小数部分用 * 2 计算的方法
0.375
0.375 * 2 = 0.75 (此时整数部分为 0 ,记下0)
0.75 * 2 = 1.50 (此时整数部分为1,记下 01,小数部。5分还剩下 0.5 我们拿出来继续之前的操作)
0.5 * 2 = 1.0 (此时整数部分为1,记下 011,此时小数部分为 0 ,结束)
定点法相对于浮点法比较简单,现在计算机的应用也比较少,我们学过编程语言都听说过,浮点数,float,double,没有听说过定点数,定点数现在有 2 中还比较常见
- 整数:定点的小数点在最后一位
- 纯浮点数:就是小数点在第一位,就是只有小数没有整数的那种。
2 (重难点)浮点法,浮点数
浮点法 -> 脱发法
我们先来看一组数字
0.123,1.23,12.3,123
他们都有一个共同的特点,就是可以用「科学计数法」 1.23 ∗ 1 0 n 1.23 * 10^n 1.23∗10n 的方法来表示
浮点法和这个类似,用类似「科学计数法」(但是这个鬼东西比科学计数法复杂)的方法来表示的更多小数位
2.1 核心公式介绍
这个让人脱发的公式是:
V = ( − 1 ) S ∗ M ∗ 2 E V = (-1)^S * M * 2^E V=(−1)S∗M∗2E
【浮点数】 = 【符号】*【分数】* 【指数】
- 符号(S):就是类似表示正数正负一样,很简单
- 分数(M):理解类似「科学计数法」的基数(类似 1.23 ∗ 1 0 n 1.23 * 10^n 1.23∗10n 的 1.23)
- 指数(E):理解类似「科学计数法」的指数(类似 1.23 ∗ 1 0 n 1.23 * 10^n 1.23∗10n 的 1 0 n 10^n 10n)
还有求出 M 和 E 公式(看不懂没关系,理解后面的例子就行了)
E = E x p o n e n t − ( 2 n − 1 − 1 ) E = Exponent - (2^{n-1} - 1) E=Exponent−(2n−1−1)
M = 1 + F r a c t i o n M = 1+Fraction M=1+Fraction
一共就这 3 个重要的公式
2.2 表示2种浮点数
表示2种浮点数的基本规则是一样的
单精度 float 浮点数(4字节 32位)
1 01111100 11100000000000000000000
【1位符号S】【8位指数 Exponent】【23位分数 Fraction】
双精度 double (8字节 64位)
1 01111100000 11100000000000000000000....00
【1位符号S】【8位指数 Exponent】【23位分数 Fraction】
具体的算法我们通过例子来讲解
2.3 实例 二进制转十进制小数
将下面的二进制 32位 浮点数 float 转化为十进制
1 01111100 11100000000000000000000
【1位符号S】【8位指数 Exponent】【23位分数 Fraction】
公式:
V = ( − 1 ) S ∗ M ∗ 2 E V = (-1)^S * M * 2^E V=(−1)S∗M∗2E
M = 1 + F r a c t i o n M = 1+Fraction M=1+Fraction
**(1)S:**首位为 1 就是负数,0 就是正数,所以这个值为负数
(2)E:
E = E x p o n e n t − ( 2 n − 1 − 1 ) E = Exponent - (2^{n-1} - 1) E=Exponent−(2n−1−1)
Exponent 就是指数,就是上面中间 8 位指数的位置,这里有 8 位 n = 8 n=8 n=8
E = 124 − ( 128 − 1 ) = − 3 E = 124 - (128-1) = -3 E=124−(128−1)=−3
(3)M:
M = 1 + F r a c t i o n M = 1+Fraction M=1+Fraction
Fraction 就是分数,就是上面 23 位分数的位置
F r a c t i o n = 1 ∗ 2 − 1 + 1 ∗ 2 − 2 + 1 ∗ 2 − 3 = 7 / 8 Fraction = 1*2^{-1} + 1 * 2^{-2} + 1*2^{-3} = 7/8 Fraction=1∗2−1+1∗2−2+1∗2−3=7/8
M = 1 + F r a c t i o n = 1 + 7 / 8 = 15 / 8 M = 1+Fraction = 1 + 7/8 = 15/8 M=1+Fraction=1+7/8=15/8
V = ( − 1 ) S ∗ M ∗ 2 E = − 1 ∗ 15 / 8 ∗ 2 − 3 = − 15 / 64 = − 0.234275 V = (-1)^S * M * 2^E = -1 * 15/8 * 2^{-3} = -15/64 = -0.234275 V=(−1)S∗M∗2E=−1∗15/8∗2−3=−15/64=−0.234275
2.4(实例)十进制小数转二进制浮点数
将 3.125 转化为 32 位二进制浮点数 float
float 的组成是
1 01111100 11100000000000000000000 【1位符号S】【8位指数 Exponent】【23位分数 Fraction】
所以我们要求
- 符号(S)
- 指数(Exponent)
- 分数(Fraction)
(1)首先将小数用「定点法」转化为二进制
十进制:3.125
为二进制:11.001
这里操作很简单,参考上面的定点法
接下来通过公式反向求
V = ( − 1 ) S ∗ M ∗ 2 E V = (-1)^S * M * 2^E V=(−1)S∗M∗2E
(2)求 S 符号
很简单,S = 1
(3)求指数 Exponent
通过我们上面可以得出,每一个 M 都是 1.xx 的,就是一点几,
所以我们要将
11.001 = 1.1001 ∗ 2 1 11.001 = 1.1001 * 2^1 11.001=1.1001∗21
这里的 E = 1,$M = 1.1001_{(2)} $
就是类似,超过就左移,小于就右移,很简单
公式:
E = E x p o n e n t − ( 2 n − 1 − 1 ) E = Exponent - (2^{n-1} -1) E=Exponent−(2n−1−1)
1 = E x p o n e n t − ( 2 8 − 1 − 1 ) 1 = Exponent - (2^{8-1} -1) 1=Exponent−(28−1−1)
E x p o n e n t = 128 Exponent = 128 Exponent=128
128 转化为二进制是 1000 0000
(这里不考虑符号了)
(4)求分数 Fraction
M = 1 + F r a c t i o n M = 1+Fraction M=1+Fraction
所以一定要求得 M 的值.
上面我们求 Exponent 的时候
11.001 = 1.1001 ∗ 2 1 11.001 = 1.1001 * 2^1 11.001=1.1001∗21
这里的 E = 1, M = 1.100 1 ( 2 ) M = 1.1001_{(2)} M=1.1001(2)
M = 1.100 1 ( 2 ) M = 1.1001_{(2)} M=1.1001(2)(二进制)带入公式
M = 1 + F r a c t i o n M = 1+Fraction M=1+Fraction
1.100 1 ( 2 ) = 1 + F r a c t i o n 1.1001_{(2)} = 1 + Fraction 1.1001(2)=1+Fraction
F r a c t i o n = 0.100 1 ( 2 ) Fraction = 0.1001_{(2)} Fraction=0.1001(2)
Fraction = 1001 0000 0000 0000 0000 000
(总和)
0 10000000 1001 0000 0000 0000 0000 000
【1位符号S】【8位指数 Exponent】【23位分数 Fraction】
这个要多练习几个例子就好了
主要是那 3 个公式
参考:https://www.jianshu.com/p/104f53c663c9