【问题标题】:Using data type like uint64_t in cgal's exact kernel在 cgal 的精确内核中使用像 uint64_t 这样的数据类型
【发布时间】: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


    【解决方案1】:

    我猜你意识到改变内核可能会对你的程序产生其他影响。

    关于您的原始问题,如果您的整数值小于 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】:

      CGAL 数字类型仅被记录为与 int 和 double 互操作。我最近添加了一些代码,以便我们可以从 long 构造更多数字(Eigen 需要),并且您的代码将在 uint64_t 为 unsigned int 或 unsigned long 的平台上的 CGAL 的下一个版本中工作(除了您输入错误的 uint64_t)(不是窗户)。对于 long long 的支持,由于我们的许多数字类型都基于其他库 (GMP),这些库本身还不支持 long long,因此可能需要稍等片刻。

      【讨论】:

        【解决方案3】:

        好的。我认为我找到了解决方案。问题是我使用了只支持双精度的精确内核,切换到不精确的内核解决了这个问题。也可以只使用双倍。 (其中一项要求是使用支持高达 2^48 的整数的数据类型)。

        【讨论】:

        • 请注意Exact_predicates_exact_constructions_kernel 不会使用整数坐标,而是使用浮点的区间算术作为谓词和不精确的double 算术用于构造。请记住接受您自己的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多