确保计算完成 64 位(或至少警告溢出)
Ensure that calculations are done 64 bits (or at least warn of overflow)
我正在使用 python 和 NumPy。我需要计算以下基本数量:
(QL * (7**k))**2
哪里
QL = 200003
k = 4
令我疑惑的是,它返回了一个错误的(负)数,这没有意义。然后我在网上看了之后才意识到问题是因为 k
是一个 32 位的 numpy 整数。
一个最小的工作示例如下:
QL = 200000
k = np.arange(10)[4]
print((QL * 7**k)**2)
这个returns 406556672
而不是正确答案230592040000000000
。这里的数字不是负数,但是还是出现同样的问题
我的问题是:
如何确保我的代码中使用的所有数字都具有最大可能的整数大小?
我不想为我创建的每个号码明确指定它。
我怎样才能至少强制 python 在发生这种情况时警告我?
当您在 Python 中写入 QL = 200003; k = 4
时,这些数字将被解释为 int
。默认情况下,如果您要将它们转换为 numpy 数组或标量,您最终会得到系统上的默认整数类型。
下面是一个使用单元素数组的例子:
QL = np.array([200003])
k = np.array([4])
在我的系统上,我发现两个数组的 dtype
都是 int32
。您可以通过选择您喜欢的 dtype 来更改它:
QL = np.array([200003], dtype=np.int64)
k = np.array([4], dtype=np.int64)
如果您在创建时无法访问数组,您可以随时转换它们:
QL = QL.astype(np.int64)
k = k.astype(int64)
整数数学值得考虑的一个选项是完全跳过 numpy 并使用 Python 的无限精度整数。如果其中一个数字是 numpy 标量或单元素数组,您可以使用 item
方法检索相应的 Python 对象:
QL = QL.item()
k = k.item()
Numpy 应该至少发出溢出警告,但显然这对某些操作失败:https://github.com/numpy/numpy/issues/8987
TL;DR
在你的例子中,k
是一个 int32
类型的 numpy 标量。您可以执行以下任一操作:
对于 numpy 64 位结果:
k = np.int64(k)
对于无限精度 Python 结果:
k = k.item()
如果您不想显式转换每个 k
,您可以使用正确的类型创建范围:
k = np.arange(10, dtype=np.int64)[4]
没有明确指定的情况下为所有新数组设置默认整数类型的可靠方法。
我正在使用 python 和 NumPy。我需要计算以下基本数量:
(QL * (7**k))**2
哪里
QL = 200003
k = 4
令我疑惑的是,它返回了一个错误的(负)数,这没有意义。然后我在网上看了之后才意识到问题是因为 k
是一个 32 位的 numpy 整数。
一个最小的工作示例如下:
QL = 200000
k = np.arange(10)[4]
print((QL * 7**k)**2)
这个returns 406556672
而不是正确答案230592040000000000
。这里的数字不是负数,但是还是出现同样的问题
我的问题是:
如何确保我的代码中使用的所有数字都具有最大可能的整数大小?
我不想为我创建的每个号码明确指定它。
我怎样才能至少强制 python 在发生这种情况时警告我?
当您在 Python 中写入 QL = 200003; k = 4
时,这些数字将被解释为 int
。默认情况下,如果您要将它们转换为 numpy 数组或标量,您最终会得到系统上的默认整数类型。
下面是一个使用单元素数组的例子:
QL = np.array([200003])
k = np.array([4])
在我的系统上,我发现两个数组的 dtype
都是 int32
。您可以通过选择您喜欢的 dtype 来更改它:
QL = np.array([200003], dtype=np.int64)
k = np.array([4], dtype=np.int64)
如果您在创建时无法访问数组,您可以随时转换它们:
QL = QL.astype(np.int64)
k = k.astype(int64)
整数数学值得考虑的一个选项是完全跳过 numpy 并使用 Python 的无限精度整数。如果其中一个数字是 numpy 标量或单元素数组,您可以使用 item
方法检索相应的 Python 对象:
QL = QL.item()
k = k.item()
Numpy 应该至少发出溢出警告,但显然这对某些操作失败:https://github.com/numpy/numpy/issues/8987
TL;DR
在你的例子中,k
是一个 int32
类型的 numpy 标量。您可以执行以下任一操作:
对于 numpy 64 位结果:
k = np.int64(k)
对于无限精度 Python 结果:
k = k.item()
如果您不想显式转换每个 k
,您可以使用正确的类型创建范围:
k = np.arange(10, dtype=np.int64)[4]
没有明确指定的情况下为所有新数组设置默认整数类型的可靠方法。