【问题标题】:"Simulating" a 64-bit integer with two 32-bit integers用两个 32 位整数“模拟”一个 64 位整数
【发布时间】:2011-09-12 13:45:26
【问题描述】:

我正在为移动设备编写一个计算量非常大的程序,并且仅限于 32 位 CPU。本质上,我正在执行大量数据(>12k 有符号 16 位整数)的点积。浮点运算太慢了,所以我一直在寻找一种方法来使用整数类型执行相同的计算。我偶然发现了一种叫做 Block Floating Point 算术的东西(链接论文的第 17 页)。它做得很好,但现在我面临 32 位的问题,只是不足以以足够的精度存储我的计算输出。

澄清一下,精度不够的原因是我必须大幅降低每个数组元素的精度,才能最终得到一个适合 32 位整数的数字。大约 16000 件事情的总和使我的结果如此巨大。

有没有办法(我希望参考一篇文章或教程)使用两个 32 位整数作为最高有效字和最低有效字在它们上定义算术(+ , -, *, /) 来有效地处理数据?此外,是否有更好的方法来做这些事情?这种方法有问题吗?我对我使用的编程语言相当灵活。我更喜欢 C/C++,但 java 也可以。我敢肯定以前有人这样做过。

【问题讨论】:

  • 我有一个愚蠢的问题 - 为什么你不能使用 long,即使在 32 位 cpu 上也是 64 位?
  • 愚蠢的答案是可以。我被一份文件误导了。谢谢=)
  • 考虑切换到本机代码。
  • 不是在 java 中它不是 - 在 java - 短总是 16 位,整数 32 位,长 64 位。这里不再长了
  • C++ 对分配给数据类型的位数的解释取决于编译器。在 Java 中,您总是得到相同的位表示。

标签: java c++ c 32bit-64bit large-data-volumes


【解决方案1】:

我很确定 JVM 必须支持 64 位算术 long 类型,如果平台不支持它,那么 VM 必须模拟它。但是,如果您无法承受使用 float 来解决性能问题,那么 JVM 可能会毁了您。

大多数 C 和 C++ 实现将为 32 位目标提供模拟的 64 位算术 - 我知道 MSVC 和 GCC 可以。但是,您应该知道,您可以使用 许多 整数指令来保存单个浮点指令。您应该考虑到该程序的规格不合理,或者您可以从其他地方释放性能。

【讨论】:

  • “如果你不能使用浮点数来解决性能问题,那么 JVM 可能会毁了你。” - 不正确。许多手机可以正常运行 JVM,但没有 FPU,因此浮点运算成本很高。其中一些甚至不支持原生应用程序,因为操作系统本身是用 Java 编写的。
  • @BlueRaja:当然,但是运行 JVM 的成本要比模拟浮点高得多。
  • 不一定。有一些常见的处理器(例如 ARM926)没有 FPU,但它们确实具有硬件加速功能,可以将 Java 字节码即时转换为本机指令,使 Java 几乎与本机代码一样快。
【解决方案2】:

是的,只需使用 64 位整数:

long val; // Java

#include <stdint.h>
int64_t val; // C

【讨论】:

    【解决方案3】:

    维基百科页面上有一个关于任意精度算术的list of libraries。也许那里的东西对你有用?

    【讨论】:

      【解决方案4】:

      如果您可以使用 Java,简短的回答是:使用 Java long's。 Java 标准定义了一个 long 为 64 位。任何 JVM 都应该实现这一点,否则它不符合标准。没有什么要求 CPU 支持 64 位算术。如果它本身不支持,JVM 应该用软件实现它。

      如果您确实有一些不支持 long 的残废 Java,请使用 BigInteger。这可以处理任意大小的整数。

      【讨论】:

        【解决方案5】:

        谈论 C/C++。
        任何普通的编译器都会支持“long long”类型作为 64 位整数和所有普通算术。
        结合 -O3,它很有可能在您的平台上为 64 位算术输出最佳代码。

        【讨论】:

          猜你喜欢
          • 2019-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-22
          • 2019-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多