线性代数与Python解法
上QQ阅读APP看书,第一时间看更新

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中输出的相应数据项进行对比