Fraction函数的学习心得
本帖最后由 Python初学者8号 于 2020-6-18 14:42 编辑原文链接https://fishc.com.cn/thread-148763-1-2.html
看了官方文本,还是不是很懂
我自己琢磨了一下, 发现应该分为5类吧,功能大致是这样的:
1. Fraction(numerator=0, denominator=1)
首先应该明白的是,在计算机科学中,浮点数书一个相比较于其他的类型比较麻烦的数,由于计算机的存储机制,浮点数无法做到和书面语言一样的精确,在此基础之上开发出了IEEE的标准。
所以呢,明白这点之后就知道,为了合理的表述浮点数,这个函数模块是使用尽可能逼真的分数去解决。换句话说,在拍肾语言中,浮点数,哪怕是有限循环小数(如1.1)也是“不精确的”。
在这个函数中,分数是用Fraction(numerator=0, denominator=1)表示的,它是足够“精确的”的数字类型。
该函数中的numerator=0, denominator=1表示的意思是:第一个参数是分子,默认为0;第二个参数为分母,默认为1。比如Fraction(1)=1;Fraction()=0;
注意https://fishc.com.cn/thread-148763-1-2.html原贴中的解释:fraction实例指的是,使用这个函数后idle显示的结果,就是Fraction(整数, 整数)(注意不可是小数哦!),此即为fraction的实例
这个Fraction(numerator=0, denominator=1)的使用案例为:
输入:
>>> Fraction(16, -10)
Fraction(-8, 5)
>>> Fraction(123)
Fraction(123, 1)
>>> Fraction()
Fraction(0, 1)
以上是三种的方法
2. Fraction(other_fraction)
这里的other_fraction是和上面的分开的,上面的是指可以写成分数(整数之比)的小数(也即为有理数),而这里输入的干脆就是比值形式的数。比如七分之三这个数吧,也即为Fraction(3/7)。
我想的是,很奇怪啊!不是有七分之三吗,我直接写七分之三(3/7)Fraction(3,7)写成不就可以了吗,为什么害写成Fraction(3/7)呢???
其实还是要回到我说的那个问题:浮点数都是精度“不够的”,那么怎么办呢?我们fraction正是为了解决在一般的“精度”之上满足“更高一点精度”而出现的,所以我们这里的Fraction(3/7)就出现了,
让他从0.42857142857142855变成具有更高精度的七分之三,也即为Fraction(7720456504063707, 18014398509481984),这个精度就是“化为有理数”我们可控的精度了,因为是有理数,而且这个形式
足够的复杂——也就是取得尽可能的逼近真实的足够位数的值,所以误差就可控了。当然我们在进行科学计算计算的时候要求更加高,也许使用的存储方式都不一样。
3 Fraction(float)
这是从float构造,比如我们所熟知的0.1+0.2==0.3是错的问题,他实际不是我们书面的0.1(我们要想得到书面语言中的这样的计算只能是使用decimal)而是这里使用这个方法表达出的分数值与float在内存中的存储值对应,可能不够精确,但是是转化为有理数的标识
比如
>>> fra.Fraction(0.1)
Fraction(3602879701896397, 36028797018963968)这就是我说的0.1不是我们书面语言的0.1,而是存在误差的,但是fraction尽可能的使用有理数表达出来。
4.Fraction(decimal) :
这是从Decimla数构造。需要注意的是,我们可以使用fraction(1.1)和1.1座运算,但是decimal却不行(这也是我说的decimal同于书面语言的地方)
>>> dec.Decimal('1.1')-1.1
Traceback (most recent call last):
File "<pyshell#70>", line 1, in <module>
dec.Decimal('1.1')-1.1
TypeError: unsupported operand type(s) for -: 'decimal.Decimal' and 'float'
5 Fraction(string)
这是从字符串得到的,可以有‘3/7’,‘37’,‘3.7’,得到的结果还是有理数的结果。但是值得一提的是,这里的‘3/7’不是数字3/7的值哦!!
如下:
>>> fra.Fraction('3/7')
Fraction(3, 7)
>>> fra.Fraction('37')
Fraction(37, 1)
>>> fra.Fraction('3.7')
Fraction(37, 10)
static/image/hrline/line7.png
大概的总结一下就是:
一般在拍肾语言中,浮点数的存储机制受到机器二进制的限制是不同于书面语言的(其实书面语言有何尝不是呢?那儿有吗么多的纸给你写无线不循环小数啊,我们都是按需索取)
decimal是为了获取同于书面语言的小数的,但是类型和它调用的括号内的不一样;
fraction则是一个一样类型的数,只是它只是有理数的形式吧了,并且他的精度是一样的哦
如下
fra.Fraction(3/7)
Fraction(7720456504063707, 18014398509481984)
>>> 7720456504063706/18014398509481984
0.4285714285714285
>>> 3/7
0.42857142857142855
前面是懂了,但后面有点{:10_269:} 紫癜聪 发表于 2020-10-8 18:45
前面是懂了,但后面有点
哈哈哈,其实就是机器的机制决定了没有‘理想’的结果,都是估值 Python初学者8号 发表于 2020-10-10 07:58
哈哈哈,其实就是机器的机制决定了没有‘理想’的结果,都是估值
嘿嘿嘿
页:
[1]