我从CGAL开始。我想要做的是创造点坐标是数字〜2^51。在cgal的内核中使用像uint64_t这样的数据类型
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。在cgal的内核中使用像uint64_t这样的数据类型
typedef CGAL::Exact_predicates_exact_constructions_kernel K;
typedef K::Point_2 P;
uint_64 x,y;
//init them somehow
P sp0(x,y);
然后我得到一个很长的模板错误。有人可以帮忙吗?
好的。我认为我找到了解决方案。问题是我使用的确切内核只支持双精度,切换到不精确的内核解决了问题。也可以使用两倍。 (其中一个要求是使用支持高达2^48的整数的数据类型)。
我猜你知道更改内核可能会对你的程序有其他影响。
关于你原来的问题,如果你的整数值大于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)不是窗户)。对于很长时间的支持,由于我们的许多数字类型都基于其他库(GMP),它们本身不支持很长的时间,所以可能需要等一会儿。
请注意,'Exact_predicates_exact_constructions_kernel'不会使用整数坐标,而是使用间隔算术,其中浮点数用于谓词和不精确的'double'算法用于构造。请记住接受你自己的答案。 – pmr