计算机在表示实数时,并没有无限的精度。大多数计算机使用浮点数来存储这些数字,但它并不能涵盖所有有理数,更不用说无理数了。
因此,当比较浮点数的大小时,必须指定公差(tolerance)——一个尽可能小的数 ε ,使得
| a-b | <ε
其中, a 和 b 是需要比较大小的两个数。
公差的数量级需要和实际问题的数量级以及期望精度一致。例如,处理行星轨道长度的问题时,其数量级为百万千米,因此使用1e-20 mm的公差没有多大意义。同样,计算原子间距时,使用1e-2 cm的公差也毫无意义。
在开始编写几何基元之前,我们需要构建一种方法,能够在给定公差 ε 后,比较两个浮点数的大小。但我们不能依靠计算机来比较浮点数,以它的逻辑,即使是只有小数点后第一百位不同,也会被判定为不同的数字。因此,我们要先构造一个函数,使用给定公差来比较两个数的大小。考虑到之后的几何计算,我们将默认公差设为1e-10,对于会进行的大多数计算来说,这是一个可以接受的精度。
在IDE中打开项目,右击项目的根文件夹,然后选择New(新建)→Python Package(Python包)。将其命名为geom2d,然后单击OK(确定)按钮。它会是我们创建的所有几何图形代码的软件包。
注意 :包名中的2D表明其内部所有内容都是二维的,当我们给文件或类命名时,都会遵循这个规则。在包内,我们会使用类似point或segment的名称,而不是point2d或segment2d。如果我们想创建一个三维几何包——geom3d,我们仍然会使用point和segment,并在三维空间上构建。
右击geom2d包文件夹,选择New(新建)→Python File(Python文件)来创建一个新文件。将其命名为nums,其他不变,然后单击OK(确定)按钮。
创建好文件后,让我们来构建第一个比较函数。清单4-1是该函数的代码。
清单4-1 比较数字大小
首先,导入math模块,它在Python的标准库中,包含一些有用的数学函数。我们的函数接收两个数字 a 和 b ,和一个可选的公差参数,如果没有提供其他值,该参数默认为1e-10。最后,使用math库中的fabs函数检验 a 和 b 之差的绝对值是否小于公差,并返回相应的布尔值。
根据经验,0和1这两个特定的值在比较中会经常出现,为了避免反复输入同样的代码:
或
我们会将它们直接写成函数。在上一个函数代码之后,添加清单4-2的代码。
清单4-2 比较某数字与0或1大小的函数
类似清单4-2中的函数并非必需,但它们很方便,且使得代码更易读。