我从 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);
然后我得到一个很长的模板错误。有人可以帮忙吗?
我从 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);
然后我得到一个很长的模板错误。有人可以帮忙吗?
CGAL Number 类型仅被记录为与 int 和 double 互操作。我最近添加了一些代码,以便我们可以从 long 构造更多数字(Eigen 需要),并且您的代码将在 uint64_t 为 unsigned int 或 unsigned long 的平台上的 CGAL 的下一个版本中工作(除了您输入错误的 uint64_t)(不是窗户)。对于 long long 的支持,由于我们的许多数字类型都基于其他库 (GMP),这些库本身还不支持 long long,因此可能需要稍等片刻。
我猜你意识到改变内核可能会对你的程序产生其他影响。
关于您最初的问题,如果您的整数值小于 2^51,那么它们完全适合双精度数(带有 53 位尾数),因此一个简单的选择是将它们转换为双精度数,如:
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);
好的。我认为我找到了解决方案。问题是我使用了只支持双精度的精确内核,切换到不精确的内核解决了这个问题。也可以只使用双倍。(其中一项要求是使用支持高达 2^48 的整数的数据类型)。