PEP 242 – 数值类型
- 作者:
- Paul F. Dubois <paul at pfdubois.com>
- 状态:
- 已撤回
- 类型:
- 标准轨道
- 创建:
- 2001 年 3 月 17 日
- Python 版本:
- 2.2
- 历史记录:
- 2001 年 4 月 17 日
摘要
此提案为用户提供了对数值计算的精度和范围的可选控制,以便可以编写一次计算,并在任何地方运行,至少达到所需的精度和范围。它与现有代码向后兼容。十进制字面量的含义已明确。
基本原理
目前,除了 Fortran 90 之外,任何语言都无法以可移植的方式编写使用浮点数并获得大致相同结果的程序,无论平台如何 - 或者如果不可能则拒绝编译。Python 目前只有一个浮点类型,相当于 C 实现中的 C double。
不存在对应于单精度或四精度浮点数的类型。尝试直接引入这些类型会使语言变得复杂,并且其后续使用将不可移植。此提案类似于 Fortran 90 的“kind”解决方案,适用于 Python 环境。有了这项功能,可以通过更改一行代码将整个计算从一个精度级别切换到另一个精度级别。如果特定机器上不存在所需的精度,程序将失败,而不是得到错误的答案。由于以这种方式编码将涉及对将失败的例程的早期调用,因此这是除编译以外的最佳选择。
支持的整数和浮点数类型
由于 Python 可以不包含复数而构建,因此复数将在下面单独讨论。
每个 Python 编译器可以定义任意数量的整数和浮点数“类型”,但必须至少支持两种整数类型,分别对应于现有的 int 和 long,并且必须至少支持一种浮点类型,等效于现在的 float。
这些必需类型的范围和精度与目前一样依赖于处理器,除了“长整数”类型,它可以保存任意整数。
内置函数 int()
、long()
和 float()
将输入转换为这些默认类型,就像目前一样。(请注意,Unicode 字符串实际上是不同“类型”的字符串,并且熟悉的人可能会扩展此 PEP 以涵盖这种情况。)
在每个类型(整数、浮点)内,编译器支持线性排序的类型集,排序由保存更大范围和/或精度的数字的能力决定。
类型对象
在名为“kinds”的模块中定义了两个新的标准函数。它们返回名为类型对象的可调用对象。每个 int 或浮点类型对象 f 都有签名 result = f(x)
,每个复数类型对象都有签名 result = f(x, y=0.)
。
int_kind(n)
- 对于整数参数
n >= 1
,返回一个可调用对象,其结果是一个整数类型,它将保存开区间 (-10**n
,10**n
) 中的整数。类型对象接受作为整数(包括长整数)的参数。如果n == 0
,则返回对应于 Python 字面量 0 的类型对象。 float_kind(nd, n)
- 对于
nd >= 0
和n >= 1
,返回一个可调用对象,其结果是一个浮点类型,它将保存至少 nd 位精度的浮点数,并且其 10 进制指数位于闭区间[-n, n]
中。类型对象接受整数或浮点数作为参数。如果 nd 和 n 都为零,则返回对应于 Python 字面量 0.0 的类型对象。
编译器将返回一个类型对象,该对象对应于其可用类型集中具有所需属性的最小类型。如果在给定实现中不存在具有所需属性的类型,则会抛出 OverflowError
异常。类型函数将其参数转换为目标类型,但如果结果不适合目标类型的范围,则会抛出 OverflowError
异常。
除了其可调用行为外,类型对象还具有属性,这些属性提供了所讨论类型的特征。
name
是类型的名称。标准类型称为 int、long、double。typecode
是一个单字母字符串,适合与Numeric
或模块array
一起使用以形成此类型的数组。标准类型的 typecode 分别为 ‘i’、‘O’、‘d’。- 整数类型具有以下附加属性:
MAX
,等于此类型的最大允许整数,或者对于长整数类型为None
。MIN
,等于此类型中最负的允许整数,或者对于长整数类型为None
。 - 浮点类型具有以下附加属性,其属性等于标准头文件“float.h”中相应 C 类型的相应值。
MAX
、MIN
、DIG
、MANT_DIG
、EPSILON
、MAX_EXP
、MAX_10_EXP
、MIN_EXP
、MIN_10_EXP
、RADIX
、ROUNDS
(==FLT_RADIX
、FLT_ROUNDS
in float.h)。这些值都是整数类型,除了MAX
、MIN
和EPSILON
,它们是 Python 浮点类型,对应于该类型。
模块类型属性
int_kinds
是可用整数类型的列表,从最低类型到最高类型排序。根据定义,int_kinds[-1]
是长整数类型。
float_kinds
是可用浮点类型的列表,从最低类型到最高类型排序。
default_int_kind
是对应于 Python 字面量 0 的类型对象
default_long_kind
是对应于 Python 字面量 0L 的类型对象
default_float_kind
是对应于 Python 字面量 0.0 的类型对象
复数
如果支持,复数的实部和虚部都是具有相同类型的浮点数。如果 Python 编译器支持复数,则它必须支持它支持的每个浮点类型的复数模拟。
如果支持复数,则以下内容在 kinds 模块中可用
complex_kind(nd, n)
- 返回一个可调用对象,其结果是一个复数类型,它将保存一个复数,其每个分量 (.real, .imag) 都是
float_kind(nd, n)
类型的。类型对象将接受一个参数,该参数可以是任何整数、实数或复数类型,也可以接受两个参数,每个参数都是整数或实数。
complex_kinds
是可用复数类型的列表,从最低类型到最高类型排序。
default_complex_kind
是对应于 Python 字面量 0.0j 的类型对象。此类型的名称为 doublecomplex,其 typecode 为 ‘D’。
复数类型对象具有以下附加属性
floatkind
是相应浮点类型的类型对象。
示例
在 myprecision.py 模块中
import kinds
tinyint = kinds.int_kind(1)
single = kinds.float_kind(6, 90)
double = kinds.float_kind(15, 300)
csingle = kinds.complex_kind(6, 90)
在我的代码的其余部分
from myprecision import tinyint, single, double, csingle
n = tinyint(3)
x = double(1.e20)
z = 1.2
# builtin float gets you the default float kind, properties unknown
w = x * float(x)
# but in the following case we know w has kind "double".
w = x * double(z)
u = csingle(x + z * 1.0j)
u2 = csingle(x+z, 1.0)
注意,整个代码可以通过更改 myprecision.py 中的参数更改为更高的精度。
注释:请注意,您不能保证 single != double;但您可以保证 double(1.e20)
将保存一个具有 15 位十进制精度的数字,并且范围高达 10**300
,或者 float_kind
调用将失败。
开放问题
目前没有提出开放问题。
版权
本文档已进入公有领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0242.rst
最后修改时间:2024 年 4 月 14 日 20:08:31 GMT