【发布时间】:2012-11-08 17:48:07
【问题描述】:
我从 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
我从 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,那么它们完全适合双精度数(带有 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);
【讨论】:
CGAL 数字类型仅被记录为与 int 和 double 互操作。我最近添加了一些代码,以便我们可以从 long 构造更多数字(Eigen 需要),并且您的代码将在 uint64_t 为 unsigned int 或 unsigned long 的平台上的 CGAL 的下一个版本中工作(除了您输入错误的 uint64_t)(不是窗户)。对于 long long 的支持,由于我们的许多数字类型都基于其他库 (GMP),这些库本身还不支持 long long,因此可能需要稍等片刻。
【讨论】:
好的。我认为我找到了解决方案。问题是我使用了只支持双精度的精确内核,切换到不精确的内核解决了这个问题。也可以只使用双倍。 (其中一项要求是使用支持高达 2^48 的整数的数据类型)。
【讨论】:
Exact_predicates_exact_constructions_kernel 不会使用整数坐标,而是使用浮点的区间算术作为谓词和不精确的double 算术用于构造。请记住接受您自己的答案。