我从CGAL开始。我想做的是创建坐标数为~2 ^ 51的点。
typedef CGAL::Exact_predicates_exact_constructions_kernel K;
typedef K::Point_2 P;
uint_64 x,y;
//init them somehow
P sp0(x,y);
然后我得到一个很长的模板错误。有人可以帮忙吗?
答案 0 :(得分:2)
我猜您已经意识到更改内核可能会对您的程序产生其他影响。
关于你的原始问题,如果你的整数值小于2 ^ 51,那么它们恰好适合双打(53位尾数),所以一个简单的选择就是将它们转换为double,如:
P sp0((double)x,(double)y);
否则,Exact_predicates_exact_construction_kernel的主要数字类型应该能够读取你的uint64值(如果在你的平台上没有问题,可以将它们转换为unsigned long long):
typedef K::FT FT;
P sp0((FT)x,(FT)y);
答案 1 :(得分:2)
CGAL数字类型仅记录为与int和double互操作。我最近添加了一些代码,因此我们可以从long构造更多数字(Eigen需要),并且您的代码将在uint64_t为unsigned int或unsigned long的平台上的下一版CGAL中工作(除了您输入uint64_t)不是窗户)。对于长期的支持,由于我们的许多数字类型都基于其他库(GMP),而这些库不支持很长时间,因此可能需要等待一段时间。
答案 2 :(得分:1)
确定。我认为我找到了解决方案。问题是我使用的精确内核只支持double,切换到不精确的内核解决了这个问题。也可以使用双倍。 (其中一个要求是使用支持最多2 ^ 48的整数的数据类型。)