Python作为计算机程序设计语言,受计算机物理结构的限制,无法表示出完整的整数集合ℤ、有理数集合ℚ、实数集合ℝ及复数集合ℂ。然而,Python所模拟的ℤ、ℚ、ℝ和ℂ在大多数实际应用中可以满足需求。
具体地说,Python中的整数取值范围仅受计算机内存容量的限制,而不受CPU字长限制。Python的浮点数的精度和取值范围均受CPU的字长限制。以float64为例,有效数字为 15 15 15~ 16 16 16位,取值范围为 − 1.7 × 1 0 308 -1.7\times10^{308} −1.7×10308~ 1.7 × 1 0 308 1.7\times10^{308} 1.7×10308。也就是说,Python以取值范围16位有效数字的有理数集合模拟ℚ乃至于实数集ℝ。Python还内置了复数类型 a + b j a+b\boldsymbol{j} a+bj来模拟复数集ℂ,其中 j \boldsymbol{j} j表示虚单位。 a a a和 b b b分别表示复数的实部和虚部,为浮点型数据。Python将整数、浮点数和复数统称为数字型数据。
运算 | 运算结果 | 备注 | |
---|---|---|---|
(1) | x + y | x 和 y 的和 | |
(2) | x - y | x 和 y 的差 | |
(3) | x * y | x 和 y 的乘积 | |
(4) | x / y | x 和 y 的商 | |
(5) | x // y | x 和 y 商的整数部分 | ⌊ x / y ⌋ \lfloor\text{x}/\text{y}\rfloor ⌊x/y⌋ |
(6) | x % y | x / y 的余数 | x-(x//y)*y |
(7) | x ** y | x 的 y 次幂 | |
(8) | -x | x 取反 | 单目运算 |
(9) | +x | x 不变 | 单目运算 |
上表中的运算可施于所有数字型数据上。需要说明的是(4)商运算 / / /和(5)整商运算 / / // //,前者运算的结果是浮点型数据,而后者运算结果是整型数据。Python代码中,整型数据不含小数,浮点型数据含小数。Python根据用户输入的数据或表达式计算结果自动判断数据类型,请看下列例子代码。
例1 Python数字型数据的算术运算。
a=4 #整型
b=3 #整型
c=a+b #整型
print(c,type(c))
c=a/b #浮点型
print(c,type(c))
c=a//b #整型
print(c,type(c))
b=3.0 #浮点型
c=a+b #浮点型
print(c,type(c))
a=0.1+0.2 #浮点型0.1+0.2
b=0.3 #浮点型0.3
print(a==b) #浮点数据相等判断
print(abs(a-b)<1e-10) #浮点数据比较
a=1+2j #复数型
c=a/b #复数型
print(c,type(c))
程序的第1、2行输入整型数据4和3(没有小数)赋予变量a和b。注意,Python用“=”作为对变量赋值的运算符,表示两个数据是否相等的比较运算符为“==”。第3行将运算而得的a与b的和a+b赋予变量c,由于加法运算对整数是封闭的(运算结果仍为整数),故c亦为整型数据,第4行输出c。
第5行将a与b的商a/b赋予c,由于整数集合KaTeX parse error: Undefined control sequence: \mathds at position 1: \̲m̲a̲t̲h̲d̲s̲{Z}构成环(参见例1-6),而不构成域(参见例1-8),故对于除法运算不是封闭的。此时,c自动转换为浮点型数据,第6行输出c。
第7行将a与b的整数商a//b(即 ⌊ a / b ⌋ \lfloor\text{a}/\text{b}\rfloor ⌊a/b⌋)赋予c。此时,运算结果为整型数据,故c为整型。第8行输出c。\par
在表达式中既有整型又有浮点型数据混合运算时,Python会将表达式中的整型计算成分自动转换成浮点型,运算的结果自然称为浮点型数据。第9行将浮点型数据3.0(带小数)赋予b,第10行将a与b的和a+b赋予c。注意此时a是整型数据(4),b是浮点数据(3.0),故c是浮点型数据。第11行输出c。
第12行将浮点型数据0.1与0.2的和赋予a,第13行将浮点型数据0.3赋予b。第14行输出相等计较表达式a==b的值:若a的值与b的值相等,该值为“True”,否则为“False”。第15行输出小于比较表达式abs(a-b)<1e-10,即 ∣ a − b ∣ < 1 1 0 10 |a-b|<\frac{1}{10^{10}} ∣a−b∣<10101的值:a与b的差的绝对值小于 1 1 0 10 \frac{1}{10^{10}} 10101该值为“True”,否则为“False”。按常识,这两个判断应该都是“True”。但是,a和b存储的是浮点型数据,它们只有有限个有效位,在有效位范围之外的情形是无法预测的。a作为0.2与0.3的和,是将两个浮点数据的无效位数通过相加传递给和,产生了第三个无效位情形,这可能会“放大”无效位效应。事实上,将其与存储在b的浮点型数据0.3进行相等比较(第14行),得出的结果是“False”。为正确地比较两个浮点型数据a和b是否相等,采用第15行的办法:计算两者差的绝对值abs(a-b),考察其值是否“很小”——小于一个设定一个“阀值”——此处为 1 1 0 10 \frac{1}{10^{10}} 10101(1e-10),此时结果为“True”。
第16行将复数数据1+2j赋予变量a,虽然输入的实部1和虚部2均未带小数,但Python会自动将其转换成浮点型。第17行将算得的a/b赋予c,第18行输出c。
运行程序,输出
1.3333333333333333 <class 'float'>
1 <class 'int'>
7.0 <class 'float'>
False
True
(0.3333333333333333+0.6666666666666666j) <class 'complex'>
所有的有理数可以表示成分数。Python有一个附加的分数型Fraction类,用于精确表示有理数。
例2 有理数的精确表示。
from fractions import Fraction as F #导入Fraction
a=F(4,1) #4的分数型
b=F(3) #3的分数型
c=a/b #分数型4/3
print(c)
d=F(1/3) #用浮点型初始化分数对象
print(d) #输出分数近似值
print(d.limit_denominator()) #最接近真值的分数
分数型数据用Fraction的初始化函数创建,其调用接口为
Fraction(d, v) \text{Fraction(d, v)} Fraction(d, v)
参数d和v分别表示分数的分子和分母。整数的分母为1,可以省略。程序中的第1行导入Fraction,为简化代码书写,取别名为F。第2、3行分别将4和3以分数型数据赋予变量a和b。前者以分子,分母方式输入,后者省略分母1。第4行计算a与b的商a/b并赋予c。第5行输出c。第6行用浮点型数据1/3初始化有理数d,第7行输出d,它是无穷小数0.3333……近似值。第8行调用Fraction对象的成员方法limit.denominator,算得最接近0.3333……的分数,即1/3。运行程序,将输出
4/3
6004799503160661/18014398509481984
1/3
读者可将此与程序1中相应输出项对比。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!