我正在尝试使用CAMPARY库(CudA 多精度算术库)。我已经下载了代码并将其包含在我的项目中。由于它同时支持 cpu 和 gpu,我从 cpu 开始了解它是如何工作的,并确保它能够满足我的需求。但目的是将其与 CUDA 一起使用。
我能够实例化一个实例并分配一个值,但我不知道如何让事情恢复原状。考虑:
#include <time.h>
#include "c:\\vss\\CAMPARY\\Doubles\\src_cpu\\multi_prec.h"
int main()
{
const char *value = "123456789012345678901234567";
multi_prec<2> a(value);
a.prettyPrint();
a.prettyPrintBin();
a.prettyPrintBin_UnevalSum();
char *cc = a.prettyPrintBF();
printf("\n%s\n", cc);
free(cc);
}
编译、链接、运行(VS 2017)。但是输出非常无用:
Prec = 2
Data[0] = 1.234568e+26
Data[1] = 7.486371e+08
Prec = 2
Data[0] = 0x1.987bf7c563caap+86;
Data[1] = 0x1.64fa5c3800000p+29;
0x1.987bf7c563caap+86 + 0x1.64fa5c3800000p+29;
1.234568e+26 7.486371e+08
像这样打印每个双精度数可能很容易,但它并不能告诉您存储的 128 数字的值。如果无法输出结果,那么执行高精度计算的价值是有限的。
除了打印出值之外,最终我还需要将这些数字转换为整数(如果有打印方法,我愿意在浮点数中全部尝试,但我担心准确性和速度都会受到影响)。与MPIR(不支持 CUDA)不同,CAMPARY 没有任何关联的多精度 int 类型,只有浮点数。我可能可以拼凑出我需要的东西(主要是加/减/比较),但前提是我可以取出 CAMPARY 值的整数部分,我看不出有什么办法。
CAMPARY 似乎没有任何文档,因此可以想象这些功能在那里,而我只是忽略了它们。我宁愿在 CAMPARY 讨论论坛/邮件列表上询问,但似乎没有。这就是我在这里问的原因。
总结一下:
- 有什么方法可以
multi_prec<2>
从 CAMPARY 输出 128bit ( ) 值吗? - 有没有办法从 CAMPARY multi_prec 中提取整数部分?也许我不理解的库中的(许多)数学函数之一计算了这个?