计算机如何表示小数?带例题(定点法、浮点法)

48 篇文章 3 订阅
12 篇文章 0 订阅

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

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) =(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 ∗ 1 0 n 1.23 * 10^n 1.2310n 的方法来表示

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

2.1 核心公式介绍

这个让人脱发的公式是:

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

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

  • 符号(S):就是类似表示正数正负一样,很简单
  • 分数(M):理解类似「科学计数法」的基数(类似 1.23 ∗ 1 0 n 1.23 * 10^n 1.2310n 的 1.23)
  • 指数(E):理解类似「科学计数法」的指数(类似 1.23 ∗ 1 0 n 1.23 * 10^n 1.2310n 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(2n11)

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)SM2E

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(2n11)

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

E = 124 − ( 128 − 1 ) = − 3 E = 124 - (128-1) = -3 E=124(1281)=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=121+122+123=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)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 ∗ 2 E V = (-1)^S * M * 2^E V=(1)SM2E

(2)求 S 符号

很简单,S = 1

(3)求指数 Exponent

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

所以我们要将

11.001 = 1.1001 ∗ 2 1 11.001 = 1.1001 * 2^1 11.001=1.100121

这里的 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(2n11)

1 = E x p o n e n t − ( 2 8 − 1 − 1 ) 1 = Exponent - (2^{8-1} -1) 1=Exponent(2811)

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.100121

这里的 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JarvanStack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值