Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

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 类型——数字。有几件事可以被认为是“数字方法”

  1. isnatural()
  2. isintegral()
  3. isrational()
  4. isreal()
  5. iscomplex()
  6. 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

上次修改:2023-09-09 17:39:29 GMT