Skip to content

Latest commit

 

History

History
228 lines (165 loc) · 6.08 KB

370-1135221-[专业选修]浮点数计算进化历史_FPU_数字协处理器_python之禅.sy.md

File metadata and controls

228 lines (165 loc) · 6.08 KB
show version enable_checker
step
1.0
true

浮点运算误差

回忆

  • 上次了解浮点类型变量
  • 有两种表示法
    • float 4-byte 单精度浮点型
    • double 8-byte 双精度浮点型
  • 浮点型特点
    • 第一位都是符号
    • 小数点都浮动
    • 浮动程度由指数部分决定
    • 尾数部分默认 1 开头
    • 后面的小数部分是有效数字
  • 这就是浮点类型的数据
  • 为什么 会有 float和double
    • 这样 存储数字的方法 呢?
  • 整体是如何进化的呢?🤪

整型数字

  • 整型数字 非常容易存储

图片描述

  • 但是究竟应该如何存储小数呢?

编程语言

  • 各种操作系统上的高级语言
    • 给出不同浮点数的形式

图片描述

  • 早期cpu只有整数运算的指令

图片描述

  • 需要编译器
    • 将小数运算翻译成
    • cpu能执行的整数运算指令

出现协处理器

  • 浮点运算的芯片最早出现在台式电脑
    • 拥有了直接计算浮点的指令
    • 浮点计算可以快很多倍
    • 并在整个80年代和90年代初变得普遍

图片描述

  • 浮点计算单元一开始 作为外设
    • 如AMD 9511
    • 英特尔8231/8232和韦泰克fpu

协处理器

  • 后来出现了 浮点运算 协处理器

图片描述

  • 直接和cpu进行协作
    • 英特尔8087
    • 摩托罗拉68881

图片描述

集成

  • 最后 浮点运算协处理器
    • 直接集成进入cpu

图片描述

  • 浮点指令
    • CPU能够直接计算
    • FADD

图片描述

python浮点运算进化

  • python 最初能够计算
    • 整型变量可以和整型变量运算
    • 浮点型变量可以和浮点型变量运算

图片描述

  • 但是 一开始
    • 不能 让 整型和浮点型 相加
      • 为什么呢?

原因

  • 指令集不同
    • 整型数字加法有自己的指令集
    • 浮点型数字加法有自己的指令集
  • 没有一个指令
    • 能算整型加上浮点型
    • 要在系统里把整型转化为浮点型
    • 再用浮点型指令集来做

图片描述

  • 想象一下
    • 1e100 + 1e-100
    • 有效数字需要对齐

解决

  • 解决这个问题的是 Tim Peters
    • 一位美国软件工程师
    • 他在 Python 发展的早期
      • 就参与了这个语言的开发和设计

图片描述

  • 他原来在为大型主机写编译器
    • 后来业余时间加入了 python 这个项目
    • 他是 Python 语言以及 CPython 的主要 contributor 之一
    • 他创造了 Timsort hybrid sorting 算法
    • 这个算法从 Python2.3 开始就在使用
      • 很硬核
  • 原来
    • 整型和浮点型不能相加减
    • 他让两个不同类型的数字可以相加
    • Python 标准模块中的 doctest 和 timeit
    • 也是他的大作
  • 他还写过
    • 一个著名的东西 p

python 之禅

  • 2001 年秋
    • Foretec(一家会议组织公司)正在准备召开第十届 International Python Conference(IPC 10,Pycon 的前身)
    • Foretec 打算征集一条印在会议 T 恤衫上的标语
    • 最终他们从 Python 社区收到了 500 多条投稿
  • Foretec 邀请了 Python 的核心开发
    • Guido
    • Fred
    • Jeremy
    • Tim Peters
    • Barry 等来担任评审
  • 评审委员们从投稿中过滤出了 130 多条后就一直没有进展
    • 直到会议快要召开时他们也没有确定最终标语
    • 在会议就要开始的前几天
    • 到了评审们不得不做出决定的时候了
  • 于是由 Tim Peters 和 Barry 两人轮流评审
    • 每人每次淘汰一半留下一半
    • 直到最后只剩一条
  • 最终
    • “import this”被选了出来
    • 大家对“import this”非常满意

查找

  • 但是当选择了这条以后
    • 他们意识到他们必须要实现它
  • sudo find / -name "this.py"

图片描述

  • 这是啥?

解码

  • 代码中的 s 字符串使用了 rot13 加密
  • rot13 就是凯撒密码的一种
    • 每个字母变换为它后面的第 13 个字母

图片描述

  • 等到 IPC 10 结束后
    • 他们悄悄的把代码提交到 Python 2.2.1
  • 过了一段时间
    • 才逐渐有人发现“import this”这个彩蛋
  • “import this”的被定为输出
    • Tim Peters 写的《The Zen of Python》

回头看

图片描述

  • 我们现在回头再看这个东西

图片描述

  • 很多东西就能解释清楚了

回忆上次

  • 无所不在的精度问题

图片描述

  • 0.23只是个理论上的浮点数
    • 但是落实到字节之后
      • 无法明确得到具体的数值

图片描述

  • 只能用最近似的值存储表示

总结

  • 这次了解浮点变量运算的进化过程
    • 浮点运算芯片
    • 数字协处理器
    • cpu直接集成浮点运算指令
  • 浮点数格式是IEEE754
    • 这就是浮点类型的数据
    • 不过这个格式没办法精准表示10进制小数
    • 就连0.1也不能
    • 所有值都是近似值!!!
  • 这个问题简直致命!
    • 没有一个小数是精确的
    • 太容易出误差
    • 尤其是和钱相关的
  • 有没有
    • 精准 对应 十进制小数的方式呢??🤪
  • 下次再说 👋