show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次了解浮点变量运算的进化过程
- 浮点运算芯片
- 数字协处理器
- 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(分数)类型有三种初始化方法
- 用小数当参数
- 用整数当分子和分母
- 用字符串
- 关于精度
- 由于二进制无法精确对应十进制小数
- 所以用分数
- 下次再说 👋