Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0384
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
- 本教程同步发布在:
- 个人网站: `https://oeasy.org`
- 蓝桥云课: `https://www.lanqiao.cn/courses/3584`
- GitHub: `https://github.com/overmind1980/oeasy-python-tutorial`
- Gitee: `https://gitee.com/overmind1980/oeasypython`
---- 浮点数的单词来自于float
- float 的意思是 浮动
- 浮动的东西是小数点
- 浮点数 就是 小数点可以浮动的 类型
- 浮点数类型的对应的float
- 究竟应该如何理解呢??🤔
10 / 3
- 结果最后一位是5???
- 这是为什么呢?
- 问题出现
- 真的发生了
- 浮点型数字精度低于整型数字
- 为什么呢?
- 浮点数表示法
- 单精度浮点型数字只有 4 个字节
- 双精度浮点型数字有 8 个字节
- 有效数字位数有限
- 所以...
- 浮点型数字被截断了...
- 最上面的图可以看出丢失了一位精度
- 而且最后一位 9 还给舍了
- 具体是怎么截断的呢?
- 去帮助 查一下float类
- help(float)
- float原意是浮动
- 浮动的东西 是小数点
- 所以float类 也叫 浮点数类
- float 类里面
- 有个成员函数 hex
- help(float.hex)
- 查找float.hex的帮助
- float的东西 是 point
- 浮动的对象 是 小数点
- p 的意思就是小数点 point
- p 前面的是有效数字
- 可以有正负号
- 0x 说明是 16 进制的表示法
- p 后面是指数
- 小数点浮动位置
-
$-4$ 就是左移 4 位 -
$+1$ 就是右移 1 位 - 指数变化会造成数量级的翻番
- 在 2 的底数基础上翻番
- p 前面的是有效数字
-
这种表示法就像我们的科学计数法
- 3e8
- 相当于3*108
-
指数的加减
- 就 对应 小数点的浮动
- 最终 将这3部分 依次放入
- 32-bit
- 4-byte
- 我们先看看
- 最简单的1是如何存储的
- 在字节序方面
- 我们选择>f
- 大字节序
-
$1.0$ 对应\x3f\x80\x00\x00- 这个规则叫做 ieee754 32-bit 浮点数规则
- 将 浮点数 存储在四个字节
- 在哪里可以验证吗?
- 最前面的 是 符号位
- 0 代表正数
- 中间的 exponent 是 指数部分
- 指数部分的加减
- 负责让数字翻倍或折半
- 让数字可以表达的范围增大
- 平衡位置在01111111
- 目前刚好是平衡位置
- 不加不减
- 目前刚好是平衡位置
- 指数部分的加减
- mantissa 尾数部分
- 在前面默认 省略了 一个1
- 负责数字的有效数字位数
- 从而确保提高数字的精度
- 指数后面的都是有效数字
- 目前这个相当于只有1
- 在前面默认 省略了 一个1
- 结果是
- 1 x 20
- 1
- 三部分
- 符号位 为0 正数
- 指数部分为平衡位置+1
- 尾数部分 依然是0 有效数字为1.0
-
$2.0$ 和$1.0$ 相比- 尾数部分没有变化
- 指数部分
$+1$ - 小数点浮动了一位
- 三部分
- 符号位 为0 正数
- 指数部分为平衡位置+2
- 尾数部分 依然是0 有效数字为1.0
-
$4.0$ 和$2.0$ 相比- 又
$x2$ - 相当于指数
$+1$ - 尾数没有变化
- 又
- 如果是
$0.5$ 呢?
-
$0.5$ 是在$1.0$ 的基础上除以 2 - 相当于在
$1.0$ 的指数部分$-1$
- 三部分
- 符号位 为0 正数
- 指数部分为平衡位置-1
- 尾数部分 依然是0 有效数字为1.0
- 指数部分从
$1.0$ 的\x3f\x80- 到
$0.5$ 的\x3f\x00
- 到
- 尾数怎么用呢?
- 然后观察
$1.5$
- 然后观察
- 三部分
- 符号位 为0 正数
- 指数部分为平衡位置
- 尾数部分 (1.1)2进制
-
$1.5$ 和$1.0$ 相比- 指数没有变化
- 小数点不用移动
- 尾数把第一位改成了 1
- 加上原来默认的1得到
$(1.1)$ 2进制
- 加上原来默认的1得到
- 指数没有变化
-
$(1.1)$ 2进制 等于$(1.5)$ 10进制
-
$3.0$ 和$1.5$ 相比- 尾数没有变化
- 指数
$+1$ - 相当于乘以
$2$
- 三部分
- 符号位 为0 正数
- 指数部分为 平衡位置 +1
- 尾数部分 (1.1)2进制
-
$-3.0$ 和$3.0$ 相比- 指数和尾数都没有变化
- 符号位从
$0$ 变$1$ - 意味着这是负数
- 2进制的0.1
- 相当于10进制的0.5
- 2进制的1.1
- 相当于10进制的1.5
- 翻倍就得到3
- 请自己练习-5
- 这个 -5 应该如何理解
- 底数 是
$(1.01)$ 2进制 - 指数是 22
- 是如何存储的呢?
- 我们前面介绍的都是单精度浮点型 float
- 单精度浮点型 float 总共 4-byte
- 还有一种 双精度浮点型
- double
- 使用 8-byte 存储
- 受到尾数精度限制
- 最后面的那个九被截取
- 消失了
- 具体怎么做的呢?
- 指数部分是
- 尾数部分是
- (1.01000011 01111011 01101001 10110100 10111010 11001101 00000101 11110001)2进制
- 这个过程也就是
- 123456789123456789
- 被截取精度的过程
- 也是浮点数
- 必须要落实到 双浮点型规定的 8-byte 的过程
- 123456789123456789
-
浮点数有三个部分组成
- 符号位
- 负责正负
-
$0$ 就是正 -
$1$ 就是负
- 指数部分
- 负责翻倍
- 以
$01111111$ 为平衡位置 -
$+1$ 相当于乘以$2$ -
$-1$ 相当于除以$2$
- 尾数部分
- 前面有一个
$1$ 不显示 - 默认就是
$1.0$ - 第一位写一个
$1$ 代表$1.1$ - 第二位再写一个
$1$ 代表$1.11$
- 前面有一个
- 符号位
-
浮点数类型的对应的float
- 究竟应该如何理解呢?🤔
-
下次再说 👋
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。


























