Skip to content

Latest commit

 

History

History
310 lines (212 loc) · 8.39 KB

371-189617-[专业选修]分数类型_Fraction.sy.md

File metadata and controls

310 lines (212 loc) · 8.39 KB
show version enable_checker
step
1.0
true

分数类型(Fraction)

回忆

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

算钱用浮点

图片描述

  • 有没有减少出错的方法?🤪

分数类型

  • 首先引入一个 module 模块
  • 模块的名字叫做 fraction

图片描述

图片描述

  • 大意就是把一个东西分成几份
  • 源文件在
    • /usr/lib/python3.8/fractions.py

查询帮助

  • help(fractions)

图片描述

  • 去试试

测试

  • 类型

图片描述

  • fractions是模块的名字
  • fractions模块里面的Fraction是一个类
  • Fraction是类的名字
  • 连起来是fractions.Fraction
  • 具体怎么产生分数呢?

产生

  • 直接调用Faction不行
  • 需要在前面加上他的名字空间(namespace)
  • 也就是fractions

图片描述

  • 调用Faction类构造函数的时候需要引用模块名fractions
  • 直接给一个浮点数的话
  • 效果并不好
  • 因为
    • 0.1是float浮点类型
    • 还是要用ieee754映射到8个字节上
    • 基于二进制的
    • 还是有误差的

分子分母

图片描述

  • 使用分子分母的构造方法试试

图片描述

  • 效果不错
  • 至少 $\frac{3}{10}$ 用分数描述没有误差
  • 甚至还会自动约分
  • 谁发明的分数呢?

分数

图片描述

  • 成比例的数字可以写成两个整数的比值
    • 也叫成比值的数
    • 包括有限小数和无限循环小数
    • rational number
    • 被翻译为有理数

图片描述

  • 不成比例的呢?

不成比例的数

  • 不能写成两个整数比值的叫做
    • 不成比值的数
    • 主要指无限不循环小数
    • irrational number
    • 被翻译为无理数
  • 有理数和无理数统称实数 Real

图片描述

  • 但是我们都叫
    • 有理数
    • 无理数
  • 怎么回事呢?

翻译缘起

  • 有理数在希腊文中称为 λογος
    • 原意是"成比例的数"
    • 毕达哥拉斯对于音高和弦长的比例很有研究
    • 对于比例和音程和谐的关系的分析也很有道理
    • 英文取其意
    • 以 ratio 为字根
    • 在字尾加上-nal 构成形容词
    • 全名为 rational number
    • 直译成汉语即是"可比数"

图片描述

  • 明末数学家徐光启和利玛窦翻译《几何原本》前 6 卷时的底本是拉丁文
    • 他们将这个词(“λογος”)译为“理”
    • 两个分数比值相同
      • 比如1/3和2/6就叫做同比之理
    • 这个“理”指的是“比值”

图片描述

翻译由来

  • 日本在明治维新以前
    • 欧美数学典籍的译本多半采用中国文言文的译本
    • 日本学者将中国文言文中的“理”直接翻译成了理
    • 而不是文言文所解释的“比值”
    • 日本学者直接翻译出了“有理数”和“无理数”

图片描述

  • 当有理数从日本传回中国时又延续这一说法
    • 清末中国派留学生到东洋留学
    • 将此名词传回中国
    • 以至现在中日两国都用“有理数”和“无理数”的说法

图片描述

数学总结

  • 正整数、零、负整数统称整数
  • 有限小数或无限循环小数都是有理数
  • 无限不循环小数是无理数
  • 有理数和无理数统称实数 Real

图片描述

分子分母

  • 分子
    • numerator
  • 分母
    • denominator

图片描述

控制精度

图片描述

  • Fraction.from_float(0.3) 和 Fraction(3,10) 并不相等
  • $0.3$ 难道不是有理数么?
  • $0.3$ 在用十进制表示的时候是一个有理数
  • 但是在 2 进制表示的时候是无限循环的
    • 还记得 $0.1+0.1+0.1$
  • 落实到具体的 52 位尾数的时候
  • 就成了一个 2 进制的 $0.3$
  • 实际上是用二进制存储的一个数
  • 然后再转回到分数形式
  • Fraction(3,10) 直接就是分数形式
  • 那可以简化分数么?

控制分母

  • limit_denominator (i_max_denominator)
  • 可以把分母的大小控制在一定的范围内

图片描述

  • limit_denominator 的作用主要是控制精度
  • 精度上去之后,可能产生的分数结果不一样
  • 不过有的时候,精度上去了,对于结果分数的影响不大
  • 比如 $1000$$10000$ 这两档,其实分数结果相同
  • 类似的还有

调节精度

图片描述

  • 前面几个结果
    • 看起来精度的变化
    • 并没有影响到最终运算的结果
    • 那是因为精度没有影响到最终分数的生成
  • 一般来说
    • 精度对于最终的分数结果是有影响的

其他进制

  • 负数
  • 其他进制形式
  • 小数
  • 都可以直接做参数么?

图片描述

  • 负数、其他进制形式都可以
  • 但是小数好像不能直接作为分子和分母
  • 小数可以作为唯一参数进入么?

转化

  • 小数可以转化为分数的形式

图片描述

  • 分数自身可以做分子分母么?

分数做分子分母

图片描述

  • 分数可以做分子、分母

分数运算

图片描述

  • ${\frac{1}{7}}/{\frac{1}{8}}=\frac{8}{7}$
  • 分数类型支持加减乘除运算
  • 结果还是分数类型

字符串形式

图片描述

  • 字符串形式会用 slash 把字符串切开
    • 分成分子和分母
    • 然后再进行分数的初始化
    • 初始化就是 initialization
    • 就像新买的电脑要进行用户名密码的初始化配置一样
    • 变量初始化就是对变量进行初始化配置
  • 每次都要引用fractions.Fraction太麻烦了
    • 可以简化么?

直接引入类

图片描述

  • 这样就可以直接使用Fraction了

更多例子

图片描述

  • $\frac{\frac{1}{7}}{\frac{2}{3}}=\frac{3}{14}$

图片描述

  • 3.1415 由于小数点后面尾数太多
  • 应该写成$\frac{31415}{10000} = \frac{6283}{2000} $

图片描述

  • 这里面提到了Decimal("1.47")
    • 这个没见过啊
  • 先去总结分数类型

总结

  • 这次了解Fraction(分数)类型变量
  • Fraction(分数)类型有三种初始化方法
    • 用小数当参数
    • 用整数当分子和分母
    • 用字符串
  • 关于精度
    • 由于二进制无法精确对应十进制小数
    • 所以用分数
  • 下次再说 👋