这主要是出于好奇心的问题。我注意到numpy测试套件contains tests for 128 bit integers和numerictypes
module指的是int128
,float256
(octuple precision?),以及其他类型的&#39}。似乎在我的机器上映射到numpy dtypes。
我的机器是64位,但我可以使用四倍128位浮点数(but not really)。我想如果可以在软件中模拟四重浮点数,理论上也可以模拟八重浮点数和128位整数。另一方面,直到现在我才从未听说过128位整数或八位精度浮点数。如果没有相应的numerictypes
,为什么在numpy的dtype
模块中引用128位整数和256位浮点数?如何使用它们?
答案 0 :(得分:4)
这是一个非常有趣的问题,可能存在与python,计算和/或硬件相关的原因。虽然不是想给出一个完整的答案,但这是我想要的......
首先请注意,类型是由语言定义的,可能与您的硬件架构不同。例如,您甚至可以使用8位处理器进行双打。当然,任何算术都涉及多个CPU指令,使计算速度慢得多。尽管如此,如果您的应用程序需要它,它可能是值得的,甚至是必需的(更好的是迟到而不是错误,特别是如果说您正在运行模拟以确定桥接稳定性......)那么需要128位精度?这是wikipedia article就可以了......
另一个有趣的细节是,当我们说计算机是64位时,这并不完全描述硬件。有许多部分可以(并且至少有时)不同的位:CPU中的计算寄存器,存储器寻址方案/存储器寄存器以及从CPU到存储器的最重要的总线的不同总线。
- ALU(算术和逻辑单元)具有进行计算的寄存器。你的机器是64位(不确定是否也意味着它们可以在相似的时间进行2次32位计算)这显然是本次讨论最相关的数量。很久以前,过去你可以出去购买co-processor以加快计算更高精度的速度......
- 保存内存地址的寄存器限制了计算机可以看到的内存(直接),这就是具有32位内存寄存器的计算机只能看到2 ^ 32字节(或大约4 GB)的原因请注意,对于16位,这变为65K这是非常低的。操作系统可以找到解决此限制的方法,但不能用于单个程序,因此32位计算机中的程序通常不能超过4GB内存。
- 这些限制是关于字节而不是位。那是因为当从内存中引用和加载时我们加载字节。事实上,这样做的方式,加载一个字节(8位)或8(64位= =你的计算机的总线长度)需要相同的时间。我要求一个地址,然后立即通过总线获取所有位。 在架构中,所有这些数量都不是相同的比特数。
答案 1 :(得分:-1)
NumPy非常强大,可以处理比内部CPU表示大得多的数字(例如64位)。
如果是动态类型,它会将数字存储在数组中。它也可以扩展内存块,这就是为什么你可以有一个500位的整数。这种动态类型称为bignum。在较旧的Python版本中,它的类型很长。在较新的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