Skip to content

Latest commit

 

History

History
333 lines (237 loc) · 7.42 KB

File metadata and controls

333 lines (237 loc) · 7.42 KB
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类 也叫 浮点数类

图片描述

  • float 类里面
    • 有个成员函数 hex
  • help(float.hex)
    • 查找float.hex的帮助

二进制形态

  • float的东西 是 point
    • 浮动的对象 是 小数点

图片描述

  • p 的意思就是小数点 point
    • p 前面的是有效数字
      • 可以有正负号
      • 0x 说明是 16 进制的表示法
    • p 后面是指数
      • 小数点浮动位置
      • $-4$ 就是左移 4 位
      • $+1$ 就是右移 1 位
      • 指数变化会造成数量级的翻番
        • 在 2 的底数基础上翻番

科学计数法的好处

  • 这种表示法就像我们的科学计数法

    • 3e8
    • 相当于3*108
  • 指数的加减

    • 就 对应 小数点的浮动

图片描述

  • 最终 将这3部分 依次放入
    • 32-bit
    • 4-byte

验证

图片描述

  • 我们先看看
    • 最简单的1是如何存储的

图片描述

  • 在字节序方面
    • 我们选择>f
    • 大字节序

图片描述

  • $1.0$ 对应 \x3f\x80\x00\x00
    • 这个规则叫做 ieee754 32-bit 浮点数规则
    • 将 浮点数 存储在四个字节
  • 在哪里可以验证吗?

1.0的存储

图片描述

  • 最前面的 是 符号位
    • 0 代表正数
  • 中间的 exponent 是 指数部分
    • 指数部分的加减
      • 负责让数字翻倍或折半
      • 让数字可以表达的范围增大
    • 平衡位置在01111111
      • 目前刚好是平衡位置
        • 不加不减
  • mantissa 尾数部分
    • 在前面默认 省略了 一个1
      • 负责数字的有效数字位数
      • 从而确保提高数字的精度
    • 指数后面的都是有效数字
    • 目前这个相当于只有1
  • 结果是
    • 1 x 20
    • 1

继续验证

图片描述

  • 三部分
    1. 符号位 为0 正数
    2. 指数部分为平衡位置+1
    3. 尾数部分 依然是0 有效数字为1.0

图片描述

  • $2.0$$1.0$ 相比
    • 尾数部分没有变化
    • 指数部分 $+1$
      • 小数点浮动了一位

$4.0$

图片描述

  • 三部分
    1. 符号位 为0 正数
    2. 指数部分为平衡位置+2
    3. 尾数部分 依然是0 有效数字为1.0

图片描述

  • $4.0$$2.0$ 相比
    • $x2$
    • 相当于指数 $+1$
    • 尾数没有变化
  • 如果是 $0.5$ 呢?

$0.5$

  • $0.5$ 是在 $1.0$ 的基础上除以 2
  • 相当于在 $1.0$ 的指数部分 $-1$

图片描述

  • 三部分
    1. 符号位 为0 正数
    2. 指数部分为平衡位置-1
    3. 尾数部分 依然是0 有效数字为1.0

图片描述

  • 指数部分从 $1.0$\x3f\x80
    • $0.5$\x3f\x00

尾数部分

  • 尾数怎么用呢?
    • 然后观察 $1.5$

图片描述

  • 三部分
    1. 符号位 为0 正数
    2. 指数部分为平衡位置
    3. 尾数部分 (1.1)2进制

图片描述

  • $1.5$$1.0$ 相比
    • 指数没有变化
      • 小数点不用移动
    • 尾数把第一位改成了 1
      • 加上原来默认的1得到 $(1.1)$ 2进制
  • $(1.1)$ 2进制 等于 $(1.5)$10进制

3

  • $3.0$$1.5$ 相比
    • 尾数没有变化
    • 指数 $+1$
    • 相当于乘以 $2$

图片描述

  • 三部分
    1. 符号位 为0 正数
    2. 指数部分为 平衡位置 +1
    3. 尾数部分 (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 的过程

浮点数总结

  • 浮点数有三个部分组成

    • 符号位
      • 负责正负
      • $0$ 就是正
      • $1$ 就是负
    • 指数部分
      • 负责翻倍
      • $01111111$ 为平衡位置
      • $+1$ 相当于乘以 $2$
      • $-1$ 相当于除以 $2$
    • 尾数部分
      • 前面有一个 $1$ 不显示
      • 默认就是 $1.0$
      • 第一位写一个 $1$ 代表 $1.1$
      • 第二位再写一个 $1$ 代表 $1.11$
  • 浮点数类型的对应的float

    • 究竟应该如何理解呢?🤔
  • 下次再说 👋


  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。