在cgal的确切内核中使用类似uint64_t的数据类型

时间:2012-11-08 17:48:07

标签: cgal

我从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);

然后我得到一个很长的模板错误。有人可以帮忙吗?

3 个答案:

答案 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的整数的数据类型。)