1.3 Python解法
1.3.1 Python的数系
Python 作为计算机程序设计语言, 受计算机物理结构的限制, 无法表示出完整的整数集、有理数集、实数集及复数集. 然而,Python 所模拟的、、和在大多数实际应用中可以满足需求.
具体地说,Python中的整数取值范围仅受计算机内存容量的限制,而不受 CPU(Central Processing Unit,中央处理器) 字长的限制. Python的浮点数的精度和取值范围均受 CPU 字长的限制. 以 float64为例,其有效数字位数为15或16,取值范围为. 也就是说,Python 以16位有效数字的有理数的集合模拟乃至. Python 还内置了复数类型来模拟复数集,其中表示虚数单位.和分别表示复数的实部和虚部,为浮点数. Python 将整数、浮点数和复数统称为数字型数据.
表1.1中的运算可用于所有数字型数据上. 需要说明的是 (4) 商运算 “/”和(5) 整商运算 “//”,前者运算的结果是浮点数,而后者的运算结果是整数. Python中,整数不含小数,浮点数含小数. Python 根据用户输入的数据或表达式计算结果自动判断其数据类型,请看下面的例子.
表1.1 数字型数据的常用运算
例1.19 Python 中数字型数据的算术运算.
程序1.1 Python 的数字型数据
1 a=4 #整数 2 b=3 #整数 3 c=a+b #整数 4 print(c,type(c)) 5 c=a/b #浮点数 6 print(c,type(c)) 7 c=a//b #整数 8 print(c,type(c)) 9 b=3.0 #浮点数 10 c=a+b #浮点数 11 print(c,type(c)) 12 a=0.1+0.2 #浮点数@(0.1+0.2)@ 13 b=0.3 #浮点数@(0.3)@ 14 print(a= =b) #浮点数相等判断 15 print(abs(a-b)<1e-10) #浮点数比较 16 a=1+2j #复数 17 c=a/b #复数 18 print(c,type(c))
程序的第1、2行输入整数4和3(没有小数) 赋予变量 a和b. 注意,Python 用 “=”作为为变量赋值的运算符,判断两个数据是否相等的比较运算符为 “”. 第3行将运算得到的a 与的和赋予变量,由于加法运算对整数是封闭的(运算结果仍为整数),故亦为整数. 第4行输出 c.
第5行将与的商赋予,由于整数集构成环 (参见例1.11),而不构成域 (参见例1.13),故对于除法运算不是封闭的. 此时,自动转换为浮点数. 第6行输出.
第7行将 a 与的整数商(即)赋予. 此时,运算结果为整数. 故为整数. 第8行输出 c.
在表达式中既有整数又有浮点数混合运算时,Python 会将表达式中的整数计算成分自动转换成浮点数,运算的结果自然为浮点数. 第9行将浮点数3.0(带小数) 赋予 b,第10行将与的和赋予. 注意此时是整数 (4),是浮点数 (3.0),故是浮点数. 第11行输出 c.
第12行将浮点数0.1与0.2的和赋予,第13行将浮点数0.3赋予 b. 第14行输出相等比较表达式的值: 若的值与的值相等,该值为 “True”,否则为 “False”. 第15行输出小于比较表达式,即的值: 若与的差的绝对值小于,该值为 “True”,否则为 “False”. 按常识,这两个判断输出的值应该都是 "True". 但是,和存储的是浮点数,它们只有有限个有效位,在有效位范围之外的情形是无法预测的. a 作为0.2(带有无效位) 与0.3(带有无效位)的和,将两个浮点数所带的无效位通过相加传递给运算结果,产生了和的无效位,这可能会产生 “放大” 无效位效应. 事实上,将其与存储在中的浮点数0.3进行相等比较 (第14行),得出的结果是 “False”. 为正确地比较两个浮点数和是否相等,采用第15行的办法: 计算两者差的绝对值,考察其值 是否 “很小”——小于一个设定的“阈值”,此处为即,此时结果为 “True”. 第16行将复数赋予变量,虽然输入的实部1和虚部2均未带小数,但 Python 会自动将其转换成浮点数. 第17行将算得的赋予,第18行输出.
运行程序, 输出
7 <class `int'> 1.3333333333333333 <class `float'> 1 <class `int'> 7.0 <class `float'> False True (0.3333333333333333+0.6666666666666666j) <class `complex'>
注意, 本例输出每一个数据项, 同时显示该数据项的类型.
所有的有理数都可以表示成分数. Python 有一个附加的分数类 Fraction, 用于精确表示有理数.
例1.20 有理数的精确表示.
程序1.2 Python 的分数
1 from fractions import Fraction as F #导入Fraction 2 a = F(4,1) #4的分数形式 3 b = F(3) #~3的分数形式 4 c = a/b #分数4/3 5 print(c) 6 d = F(1/3) #用浮点数初始化分数对象 7 print(d) #输出分数近似值 8 print(d.limit_denominator()) #最接近真值的分数
分数用 Fraction 的初始化函数创建, 其调用格式为
Fraction(d, v).
参数和分别表示分数的分子和分母. 整数的分母为1,可以省略. 程序中的第1行导入 Fraction,为简化代码书写,为其取别名为. 第行分别将4和3以分数形式赋予变量和. 前者以分子、分母方式输入,后者省略分母1. 第4行计算与的商并将其赋予 c. 第5行输出 c. 第6行用浮点数初始化分数对象并将其赋予有理数第7行输出,它是无穷小数的近似值. 第8行调用 Fraction 对象的成员方法 limit_denominator,算得最接近的分数,即. 运行程序,将输出
4/3 6004799503160661/18014398509481984 1/3
读者可将此与程序1.1中输出的相应数据项进行对比