Использование типа данных, такого как uint64_t, в точном ядре 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);

Затем я получил длинную ошибку шаблона. Кто-нибудь может помочь?


person gregory561    schedule 08.11.2012    source источник


Ответы (3)


Я думаю, вы понимаете, что изменение ядра может иметь другие последствия для вашей программы.

Что касается вашего первоначального вопроса, если ваши целые значения меньше 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);
person Sylvain Pion    schedule 11.11.2012

Типы чисел CGAL задокументированы только для взаимодействия с int и double. Недавно я добавил некоторый код, чтобы мы могли создавать больше чисел из long (требуется для Eigen), и ваш код будет работать в следующей версии CGAL (за исключением того, что вы опечатали uint64_t) на платформах, где uint64_t является unsigned int или unsigned long ( не окна). Для поддержки long long, поскольку многие из наших типов чисел основаны на других библиотеках (GMP), которые сами еще не поддерживают long long, возможно, придется немного подождать.

person Marc Glisse    schedule 06.01.2013

Ok. Я думаю, что нашел решение. Проблема заключалась в том, что я использовал точное ядро, которое поддерживает только двойное число, переход на неточное ядро ​​​​решил проблему. Также можно было использовать просто двойной. (одним из требований было использование типа данных, поддерживающего целые числа до 2^48).

person gregory561    schedule 08.11.2012
comment
Имейте в виду, что Exact_predicates_exact_constructions_kernel не будет использовать целочисленные координаты, а будет использовать интервальную арифметику с плавающей запятой для предикатов и неточную double арифметику для конструкций. Пожалуйста, не забудьте принять свой собственный ответ. - person pmr; 11.11.2012