“模拟”具有两个32位整数的64位整数

时间:2011-06-10 14:45:04

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

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

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

有没有办法(我喜欢对文章或教程的引用)使用两个32位整数作为最重要的单词和最不重要的单词定义它们的算术(+ , - ,*,/)有效地处理数据?还有,有没有更好的方法来做这些事情?这种方法有问题吗?我对使用的编程语言非常灵活。我更喜欢C / C ++,但java也可以。我确定之前有人这样做过。

5 个答案:

答案 0 :(得分:7)

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

大多数C和C ++实现将提供针对32位目标模拟的64位算法 - 我知道MSVC和GCC可以。但是,您应该知道您可以讨论许多整数指令来保存单个浮点指令。你应该考虑这个程序的规范是不合理的,或者你可以从其他地方免费获得性能。

答案 1 :(得分:4)

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

long val; // Java

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

如果你可以使用Java,简短的回答是:使用Java long。 Java标准定义了长达64位。任何JVM都应该实现这一点,或者它不符合标准。没有什么需要CPU支持64位算术。如果它本身不受支持,JVM应该用软件实现它。

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

答案 4 :(得分:2)

谈论C / C ++ 任何普通编译器都支持“long long”类型作为具有所有正常算术的64位积分器 结合-O3,它可以很好地在您的平台上输出64位arithemtic的最佳代码。