19

这主要是出于好奇。我注意到 numpy 测试套件包含对 128 位整数的测试,并且该numerictypes模块引用了int128float256八倍精度?)和其他似乎没有映射到我机器上的 numpy dtypes 的类型。

我的机器是 64 位的,但我可以使用四倍 128 位浮点数(但不是真的)。我想如果可以在软件中模拟四倍浮点数,理论上也可以模拟八倍浮点数和 128 位整数。另一方面,直到刚才我还从未听说过 128 位整数或八倍精度浮点数。numerictypes如果没有对应的 s,为什么在 numpy 的模块中会引用 128 位整数和 256 位浮点数,dtype我该如何使用它们?

4

2 回答 2

4

这是一个非常有趣的问题,可能有与 python、计算和/或硬件相关的原因。虽然不想给出一个完整的答案,但这是我要去做的……

首先请注意,类型是由语言定义的,并且可能与您的硬件架构不同。例如,您甚至可以使用 8 位处理器进行双打。当然,任何算术都涉及多个 CPU 指令,从而使计算速度慢得多。尽管如此,如果您的应用程序需要它,它可能是值得的,甚至是需要的(迟到总比错误好,特别是如果您正在运行模拟以实现桥稳定性......)那么需要 128 位精度吗?这是关于它的维基百科文章......

一个更有趣的细节是,当我们说一台计算机是 64 位时,这并没有完全描述硬件。有很多部分可以是(至少有时是)不同的位:CPU 中的计算寄存器、内存寻址方案/内存寄存器和不同的总线,其中最重要的是从 CPU 到内存的总线。

- ALU(算术和逻辑单元)具有进行计算的寄存器。您的机器是 64 位的(不确定这是否也意味着它们可以同时进行 2 次 32 位计算)这显然是与本次讨论最相关的数量。很久以前,你可以出去买一个协处理器来加速计算更高精度的速度……

- 保存内存地址的寄存器限制了计算机可以(直接)看到的内存,这就是为什么具有 32 位内存寄存器的计算机只能看到 2^32 字节(或大约 4 GB)请注意,对于 16 位,这变成了 65K,这是非常低的。操作系统可以找到绕过此限制的方法,但不能针对单个程序,因此 32 位计算机中的任何程序通常都不能拥有超过 4GB 的内存。

- 请注意,这些限制是关于字节,而不是位。那是因为当从内存中引用和加载时,我们会加载字节。事实上,这样做的方式是,加载一个字节(8 位)或 8 个(64 位 == 计算机的总线长度)需要相同的时间。我要求一个地址,然后立即通过总线获取所有位。可能在一个架构中,所有这些数量都不是相同的位数。

于 2016-09-30T09:20:47.983 回答
-3

NumPy 非常强大,可以处理比内部 CPU 表示(例如 64 位)大得多的数字。

在动态类型的情况下,它将数字存储在数组中。它也可以扩展内存块,这就是为什么你可以有一个 500 位的整数。这种动态类型称为 bignum。在较旧的 Python 版本中,它是 long 类型。在较新的 Python(3.0+)中,只有 long,称为 int,它支持几乎任意数量的数字(-> bignum)。

如果指定数据类型(例如 int32),则指定位长度和位格式,即内存中的哪些位代表什么。例子:

dt = np.dtype(np.int32)      # 32-bit integer
dt = np.dtype(np.complex128) # 128-bit complex floating-point number

查看:https ://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html

于 2016-10-20T11:30:48.133 回答