Skip to content

Latest commit

 

History

History
266 lines (189 loc) · 7.15 KB

374-189619-[专业选修]深入整型数字.sy.md

File metadata and controls

266 lines (189 loc) · 7.15 KB
show version enable_checker
step
1.0
true

深入整型数字

回忆

  • 上次了解科学计数法
  • 科学计数法分成有效数字和指数两块
  • 找到了双精度 double 型中绝对值最小和最大的数
  • 最后发现 int 型在大数方面超过了双精度?
  • 这可能吗?🤪

回忆上次

图片描述

  • 看起来是可以进行乘法运算的
  • 可是计算机里面最大的整型数字不就是无符号的 long 型么?

最大整型

图片描述

  • q 是 8 字节 有符号整型
  • Q 是 8 字节 无符号整型

图片描述

  • 系统加法默认的是哪种数据类型呢?

验证

  • 找到最大值
    • 无符号
      • 全1最大
    • 有符号
      • 符号位为0
      • 其余全1最大

图片描述

  • 系统所用的最大的整数是 9223372036854775807
  • 也就是说
    • 系统关于整数的默认数据类型是
    • 8 字节有符号整数

再加 1

  • 在最大的数值上再加上一根稻草
  • 骆驼并没有压倒?!

图片描述

  • 可是他确实无法落实到 8 字节的有符号整型数据类型上
  • 甚至超过了 8 字节无符号整型的最大值

图片描述

  • 怎么解释?!!

继续分析

图片描述

  • 8 个字节能装进去最大的东西
  • 如果再加 1
  • 肯定 8 个字节放不下
  • 但是 9 个字节能放下
  • 是不是 python 进行了什么样的处理
  • 既然他能放进去
  • 肯定做了相应的处理
  • 难道他自己定义了数据类型?

明确类型

  • 首先明确运算
    • 加运算
  • 同样是加法运算符
  • 不同的数据类型有不同的运算方法
    • 字符串
      • 拼接
    • 浮点型
      • 数据是双精度类型
      • 直接用 cpu 的浮点运算指令进行加法
    • 整型
      • 数据可能超过 8 个字节
      • 运算的方法是 python 自己定制的
      • 结果也是 python 自己定制的
  • 观察被加数和加数范围

图片描述

具体处理

图片描述

  • 如果 8 个字节都放得下
    • 就放进去直接加
  • 如果 8 个字节放不下
    • 就扩展 1个字节
    • 使用 9个字节 存储
    • 如果还不够就再扩展直到满足
  • 同样位置的 8 字节相加
    • 并直接进位
  • 得到的 8、10、12...字节就是我们需要的结果

回顾历史

  • 关于大数计算
  • ABC 语言 也就是 python 之前 Guido 参与的语言就支持
  • 不用引入任何大数计算的包
  • 可以进行很大整数的精确计算
  • 这一点是从根上来的
  • 因为 Guido 当时所在的 cwi
  • 是数学与计算中心
  • 天生就是要和数学家科学家打交道的
  • 这也是为什么 python 后来在数学科学领域很厉害的原因

目的

  • python 为什么要帮我们搞特别大的整数运算呢?
  • 因为 python 想要让用户用的很方便
  • python3 统一使用了长整型 适合大数据运算 不会溢出
  • 不用分短整型,整型,长整型...
  • python 就降低其他行业的学习门槛了。
  • 直接加就完事了
  • 复杂的工作都交给 python
  • 绝对精确而且不会溢出
  • 这确实对于初学者很友好
  • 用抽象的方式得到了好的结果
  • 还屏蔽了具体实现的细节
  • 还记得 guido 最开始在哪里工作吗?
    • 荷兰的数学与计算机研究中心
    • 一切都不是偶然
  • 不过,数字太长了
  • 不容易看出来多少位
  • 有什么办法吗?

分割位

  • 分割位 可以使用 _ 来表示
    • 而且 不会影响整型数字的数值
    • 12_345 就是 $1234$

图片描述

  • 为什么要在千位前面加下划线
    • 而不是在其他地方加下划线呢?

千位

  • 12_345 英文读作
    • twelve thousand, three hundred and forty-five
    • 12个千 然后是 三百四十五
    • 在往上是
      • million
      • billion

图片描述

  • 都卡在 103 这个位置上

图片描述

  • 转来转去都很方便
    • 外国在千分位放分隔符
    • 而且一般用的是逗号
    • 可以把下划线改成逗号么

逗号

  • 加了逗号的数字

图片描述

  • 是没法直接用int函数转化回来的

转化

  • 可以通过字符替换函数 replace() 替换
    • ","逗号 替换为"" 啥也没有

图片描述

  • 我们中文 一般管12,3456 叫 十二万三千四百五十六
    • 用的是万分位
    • 可以将数字 转化为 万分位 么?

万分位

  • 引入 re 模块
    • re 是正则表达式模块
    • re.sub(r"(?<=\d)(?=(?:\d\d\d\d)+$)",",","12345")
    • 引入之后可以得到我们想要的字符串

图片描述

类型转化

图片描述

  • str 可以把整型、浮点型数字转化为字符串
  • int 可以把字符串转化为整型数字
  • float 可以把字符串转化为 float
  • 可是
  • 如果我不知道这个字符串是整型还是浮点型怎么办?

图片描述

  • 可以用eval函数转化回来吗?

eval

  • eval 就是
    • evaluation 衡量计算

图片描述

  • eval 和 str 是逆运算
  • str 把任意类型转为字符串
  • eval 把字符串转为相应类型的数字
  • eval 是什么意思呢?

evaluate

图片描述

  • 这个 eval 来自于 evaluate
  • 衡量计算
  • 可以用这个eval
    • 将"1,234"转化为整数吗?

转化

  • 直接转化失败

图片描述

  • 还是得绕个路

图片描述

  • 不但可以衡量具体的值
    • 还可以计算一个表达式

图片描述

总结

  • 这次深入了整型的细节
    • python 把复杂的逻辑都留给自己
    • 对我们提供一个近乎无限大的整型变量
    • 可以做绝对精确的计算
    • 还不会溢出
    • 很厉害
  • python 还可以用千分位符分割整数和小数
    • 这有利于观察很大的数字
  • 这些很大的数字都怎么来的?
    • 加法和乘法都比较慢
  • 有乘方运算吗??🤪
  • 下次再说 👋