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 最初能够计算
- 整型变量可以和整型变量运算
- 浮点型变量可以和浮点型变量运算
- 但是 一开始
- 不能 让 整型和浮点型 相加
- 为什么呢?
- 不能 让 整型和浮点型 相加
- 指令集不同
- 整型数字加法有自己的指令集
- 浮点型数字加法有自己的指令集
- 没有一个指令
- 能算整型加上浮点型
- 要在系统里把整型转化为浮点型
- 再用浮点型指令集来做
- 想象一下
- 1e100 + 1e-100
- 有效数字需要对齐
- 解决这个问题的是 Tim Peters
- 一位美国软件工程师
- 他在 Python 发展的早期
- 就参与了这个语言的开发和设计
- 他原来在为大型主机写编译器
- 后来业余时间加入了 python 这个项目
- 他是 Python 语言以及 CPython 的主要 contributor 之一
- 他创造了 Timsort hybrid sorting 算法
- 这个算法从 Python2.3 开始就在使用
- 很硬核
- 原来
- 整型和浮点型不能相加减
- 他让两个不同类型的数字可以相加
- Python 标准模块中的 doctest 和 timeit
- 也是他的大作
- 他还写过
- 一个著名的东西 p
- 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也不能
- 所有值都是近似值!!!
- 这个问题简直致命!
- 没有一个小数是精确的
- 太容易出误差
- 尤其是和钱相关的
- 有没有
- 精准 对应 十进制小数的方式呢??🤪
- 下次再说 👋