【问题标题】:Numpy octuple precision floats and 128 bit ints. Why and how?Numpy 八倍精度浮点数和 128 位整数。为什么以及如何?
【发布时间】:2023-03-03 04:15:02
【问题描述】:

这主要是出于好奇。我注意到 numpy 测试套件 contains tests for 128 bit integersnumerictypes module 指的是 int128float256 (octuple precision?),以及其他似乎没有映射到我机器上的 numpy dtypes 的类型。

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

【问题讨论】:

  • 我想你可以在理论上计算出任何 32 * n64 * n 精度,但我不得不说,那些仅在测试中实现的类型很有趣。
  • 请记住,np.float128 通常没有 128 位的精度 - 它相当于 C long double,在 x86 (see here) 上通常有 80 位。跨度>
  • @ali_m 我明白了。我今天学到了一些新东西!
  • 一般建议使用np.longdouble 而不是np.float128 以避免这种混淆来源。恕我直言,如果 numpy 根本不公开 float128 dtype 会更好......

标签: python numpy int128


【解决方案1】:

这是一个非常有趣的问题,可能与 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 位 == 计算机的总线长度)需要相同的时间。我要求一个地址,然后立即通过总线获取所有位。 可能在一个架构中,所有这些数量都不是相同的位数。

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 128bit复数为正常双精度
    • float32 是单精度浮点,float64 是双精度浮点,float96 扩展,float128 扩展精度浮点。复数有两个分量,即每个分量的半角:complex64 是单精度复数,complex128 是双精度复数。
    猜你喜欢
    • 2020-01-14
    • 2020-04-24
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多