PEP 228 – 重构 Python 的数值模型
- 作者:
- Moshe Zadka <moshez at zadka.site.co.il>,Guido van Rossum <guido at python.org>
- 状态:
- 已撤回
- 类型:
- 标准规范
- 创建:
- 2000年11月4日
- 更新历史:
撤回
此 PEP 已被撤回,取而代之的是 PEP 3141。
摘要
如今,Python 的数值模型类似于 C 语言的数值模型:存在几种不相关的数值类型,当请求数值类型之间的运算时,就会发生强制转换。虽然 C 语言数值模型的基本原理是它非常类似于硬件级别的运算,但该原理不适用于 Python。因此,虽然 C 语言程序员可以接受 2/3 == 0
,但许多 Python 程序员对此感到惊讶。
注意:鉴于新闻组中最近的讨论,此 PEP 中的动机(和细节)需要扩展。
基本原理
在可用性研究中,Python 最不可用的一方面是整数除法返回除法的向下取整结果。这使得编写正确的程序变得困难,需要在代码的各个部分强制转换为 float()
。Python 的数值模型源于 C 语言,而一个可能更容易使用的模型可以基于对数字的数学理解。
其他数值模型
Perl 的数值模型是存在一种类型的数字——浮点数。虽然它一致且表面上不令人惊讶,但它往往会有一些细微的陷阱。其中之一是打印数字非常棘手,需要正确的舍入。在 Perl 中,还有一种模式,其中所有数字都是整数。这种模式也存在其自身的问题,这些问题源于这样一个事实,即甚至没有一种近似的方法可以除以数字并获得有意义的答案。
Python 数值模型的建议接口
虽然强制转换规则将保留用于附加类型和类,但内置类型系统将只有一种 Python 类型——数字。有几件事可以被认为是“数字方法”
isnatural()
isintegral()
isrational()
isreal()
iscomplex()
isexact()
显然,一个对 1 到 5 中的问题回答为真的数字,也将对任何后续问题回答为真。如果 isexact()
不为真,则任何答案都可能错误。(但不会严重错误:它接近真实值。)
现在,模型对域运算(+
、-
、/
、*
)做出了两个承诺
- 如果两个操作数都满足
isexact()
,则结果满足isexact()
。 - 所有域规则都成立,但对于不满足
isexact()
的数字,它们可能仅近似成立。
这两个规则的一个结果是,所有精确计算都作为(复数)有理数进行:由于域定律必须成立,因此
(a/b)*b == a
必须成立。
有一个内置函数 inexact()
,它接受一个数字并返回一个不精确的数字,该数字是一个良好的近似值。不精确的数字必须至少与使用 IEEE-754 一样精确。
即使给定不精确的数字,一些经典的 Python 函数也会返回精确的数字:例如,int()
。
强制转换
数字类型未定义 nb_coerce
任何数值运算槽,当接收除 PyNumber
以外的内容时,都会拒绝实现它。
不精确运算
math
模块中的函数将被允许对精确值返回不精确的结果。但是,它们永远不会返回非实数。 cmath
模块中的函数也被允许对精确参数返回不精确的结果,并且还被允许对实数参数返回复数结果。
数值 Python 问题
使用数值 Python 的人这样做是为了获得高性能的向量运算。因此,NumPy 应该保留其基于硬件的数值模型。
未解决的问题
哪些数字字面量是精确的,哪些是不精确的?
我们如何处理 IEEE 754 运算?(可能,isnan/isinf 应该是方法)
在 64 位机器上,当比较涉及转换为浮点数时,int 和 float 之间的比较可能会中断。long 和 float 之间的比较也是如此。这可以通过避免转换为浮点数来解决。(由于 Andrew Koenig)。
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0228.rst