PEP 239 – 为 Python 添加有理数类型
- 作者:
- Christopher A. Craig <python-pep at ccraig.org>, Moshe Zadka <moshez at zadka.site.co.il>
- 状态:
- 已拒绝
- 类型:
- 标准跟踪
- 创建时间:
- 2001 年 3 月 11 日
- Python 版本:
- 2.2
- 历史记录:
- 2001 年 3 月 16 日
摘要
Python 没有具有无限精度有理数语义的数字类型。本提案解释了这种类型的语义,并建议使用内建函数和字面量来支持这种类型。该 PEP 没有建议有理数的字面量;这将留待 另一个 PEP 处理。
理由
尽管有理数算术有时速度较慢且占用更多内存(通常,是无限的),但它更接近数学上的理想数字,并且往往具有对新手来说不太令人惊讶的行为。虽然已经编写了许多 Python 有理数实现,但它们都不存在于核心代码中,也没有任何文档。这使得那些不太精通 Python 的人难以访问它们。
有理数类型
将添加一个新的数字类型,名为 RationalType
。它的单目运算符将执行显而易见的操作。二元运算符将整数和长整数强制转换为有理数,并将有理数强制转换为浮点数和复数。
将支持以下属性:.numerator
和 .denominator
。语言定义将承诺
r.denominator * r == r.numerator
分子和分母的最大公约数为 1,并且分母为正。
方法 r.trim(max_denominator)
将返回最接近 r
的有理数 s
,使得 abs(s.denominator) <= max_denominator
。
rational() 内建函数
该函数将具有以下签名:rational(n, d=1)
。 n
和 d
必须是整数、长整数或有理数。保证
rational(n, d) * d == n
待解决问题
- 也许该类型应该称为 rat 而不是 rational。有人提议我们将“抽象”的纯数学类型命名为 complex、real、rational、integer,并将“具体”的表示类型命名为 float、rat、long、int。
- 是否允许具有整数值的有理数作为序列索引?例如,
s[5/3 - 2/3]
是否等效于s[1]
? - 是否允许对有理数使用
shift
和mask
运算符?对于具有整数值的有理数? - Marcin ‘Qrczak’ Kowalczyk 在 c.l.py 上很好地总结了将整数与有理数统一的理由。
将整数与有理数统一的理由
- 由于
2 == 2/1
,并且可能str(2/1) == '2'
,因此它减少了对象看起来相等但行为不同的意外情况。 /
可以自由地用于整数除法,当我知道没有余数时(如果我错了,并且存在余数,那么之后可能会出现一些异常)。
反对的理由
- 当我将
/
的结果用作序列索引时,通常这是一个错误,不应该通过使程序对某些数据工作来隐藏它,因为它会对其他数据产生错误。 - (假设在统一 int 和 rational 后,它们将成为不同的类型:)类型很少依赖于值。当变量的类型已知时,推理起来更容易:我知道如何使用它。我可以确定某事物是 int,并期望在此处使用的其他对象也是 int。
- (假设它们的类型相同:)Int 本身就是一个很好的类型,不应该与有理数混合。某事物是整数的事实应该可以用关于其类型的语句来表达。许多操作需要 int,并且不接受有理数。自然地将它们视为不同类型。
- 由于
参考
版权
该文档已置于公有领域。
来源: https://github.com/python/peps/blob/main/peps/pep-0239.rst
上次修改时间: 2024 年 4 月 14 日 20:08:31 GMT