PEP 240 – 向 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日
摘要
一个不同的 PEP建议向 Python 添加内置的有理数类型。此 PEP 建议将 Python 中的 ddd.ddd 浮点数字面量更改为有理数,并修改非整数除法以返回它。
BDFL 声明
此 PEP 已被拒绝。基本原理部分中概述的需求已在一定程度上通过接受PEP 327进行十进制运算得到解决。Guido 还指出,“有理数运算是在 ABC 中默认的“精确”运算,但结果并非如预期”。请参阅 2005 年 6 月 17 日的 python-dev 讨论[1]。
基本原理
有理数对于精确且不出乎意料的算术运算很有用。它们给出了人们在各种数学课程中所学到的正确结果。使“明显”的非整数类型具有更可预测的语义,这比使用浮点数更能减少新程序员的意外。正如 c.l.py 和tutor@python.org 上的许多帖子所示,人们经常会遇到浮点数的奇怪语义:例如,round(0.98, 2)
仍然给出 0.97999999999999998。
提案
符合正则表达式 '\d*.\d*'
的字面量将是有理数。
向后兼容性
唯一向后兼容的问题是上面提到的字面量的类型。建议进行以下迁移
- 批准后的下一个 Python 版本将允许
from __future__ import rational_literals
使所有此类字面量都被视为有理数。 - Python 3.0 将在默认情况下启用一个关于此类字面量的警告,前提是没有
__future__
语句。警告消息将包含有关__future__
语句的信息,并指示要获取浮点数字面量,应在其后附加“e0”。 - Python 3.1 将默认情况下禁用此警告。此警告将保留 24 个月,在此期间,字面量将是有理数,并且警告将被删除。
常见异议
有理数速度慢且内存占用大!(放松,我并没有移除浮点数,我只是添加了两个字符。 1e0
仍然是浮点数)
有理数必须以十进制浮点数的形式呈现,否则对于期望十进制数的用户来说将非常糟糕(即 str(.5)
应该返回 '.5'
而不是 '1/2'
)。这意味着许多有理数必须在某个点被截断,这给我们带来了新的精度损失。
参考文献
版权
本文档已进入公有领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0240.rst
上次修改时间:2023年9月9日 17:39:29 格林尼治标准时间