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