小数的表示分为「定点法」和「浮点法」

1 定点法,定点数

定点法就是小数是预先约定好的

举个例子

(1)二进制转十进制

二进制 101.011 转化为十进制

101.011101.011101.011

=(1∗20+0∗21+1∗22)+(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)=(120+021+122)+(021+122+123)

=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 中还比较常见

  1. 整数:定点的小数点在最后一位
  2. 纯浮点数:就是小数点在第一位,就是只有小数没有整数的那种。

2 (重难点)浮点法,浮点数

浮点法 -> 脱发法

我们先来看一组数字

0.123,1.23,12.3,123

他们都有一个共同的特点,就是可以用「科学计数法」 1.23∗10n1.23 * 10^n1.2310n 的方法来表示

浮点法和这个类似,用类似「科学计数法」(但是这个鬼东西比科学计数法复杂)的方法来表示的更多小数位

2.1 核心公式介绍

这个让人脱发的公式是:

V=(−1)S∗M∗2EV = (-1)^S * M * 2^EV=(1)SM2E

【浮点数】 = 【符号】*【分数】* 【指数】

  • 符号(S):就是类似表示正数正负一样,很简单
  • 分数(M):理解类似「科学计数法」的基数(类似 1.23∗10n1.23 * 10^n1.2310n 的 1.23)
  • 指数(E):理解类似「科学计数法」的指数(类似 1.23∗10n1.23 * 10^n1.2310n10n10^n10n

还有求出 M 和 E 公式(看不懂没关系,理解后面的例子就行了)

E=Exponent−(2n−1−1)E = Exponent - (2^{n-1} - 1)E=Exponent(2n11)

M=1+FractionM = 1+FractionM=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∗2EV = (-1)^S * M * 2^EV=(1)SM2E

M=1+FractionM = 1+FractionM=1+Fraction

**(1)S:**首位为 1 就是负数,0 就是正数,所以这个值为负数


(2)E:

E=Exponent−(2n−1−1)E = Exponent - (2^{n-1} - 1)E=Exponent(2n11)

Exponent 就是指数,就是上面中间 8 位指数的位置,这里有 8 位 n=8n=8n=8

E=124−(128−1)=−3E = 124 - (128-1) = -3E=124(1281)=3


(3)M:

M=1+FractionM = 1+FractionM=1+Fraction

Fraction 就是分数,就是上面 23 位分数的位置

Fraction=1∗2−1+1∗2−2+1∗2−3=7/8Fraction = 1*2^{-1} + 1 * 2^{-2} + 1*2^{-3} = 7/8Fraction=121+122+123=7/8

M=1+Fraction=1+7/8=15/8M = 1+Fraction = 1 + 7/8 = 15/8M=1+Fraction=1+7/8=15/8


V=(−1)S∗M∗2E=−1∗15/8∗2−3=−15/64=−0.234275V = (-1)^S * M * 2^E = -1 * 15/8 * 2^{-3} = -15/64 = -0.234275V=(1)SM2E=115/823=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∗2EV = (-1)^S * M * 2^EV=(1)SM2E

(2)求 S 符号

很简单,S = 1

(3)求指数 Exponent

通过我们上面可以得出,每一个 M 都是 1.xx 的,就是一点几,

所以我们要将

11.001=1.1001∗2111.001 = 1.1001 * 2^111.001=1.100121

这里的 E = 1,$M = 1.1001_{(2)} $

就是类似,超过就左移,小于就右移,很简单

公式:

E=Exponent−(2n−1−1)E = Exponent - (2^{n-1} -1)E=Exponent(2n11)

1=Exponent−(28−1−1)1 = Exponent - (2^{8-1} -1)1=Exponent(2811)

Exponent=128Exponent = 128Exponent=128

128 转化为二进制是 1000 0000(这里不考虑符号了)

(4)求分数 Fraction

M=1+FractionM = 1+FractionM=1+Fraction

所以一定要求得 M 的值.

上面我们求 Exponent 的时候

11.001=1.1001∗2111.001 = 1.1001 * 2^111.001=1.100121

这里的 E = 1,M=1.1001(2)M = 1.1001_{(2)}M=1.1001(2)

M=1.1001(2)M = 1.1001_{(2)}M=1.1001(2)(二进制)带入公式

M=1+FractionM = 1+FractionM=1+Fraction

1.1001(2)=1+Fraction1.1001_{(2)} = 1 + Fraction1.1001(2)=1+Fraction

Fraction=0.1001(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

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐