私は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);
次に、長いテンプレートエラーが発生しました。誰かが助けることができますか?
カーネルを変更すると、プログラムに他の影響が及ぶ可能性があることをご存知だと思います。
元の質問に関して、整数値が2 ^ 51より小さい場合、それらは正確にdoubleに適合します(53ビット仮数)。したがって、1つの簡単なオプションは、次のようにそれらをdoubleにキャストすることです。
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がunsignedintまたはunsignedlong(uint64_tを入力した場合を除く)の次のバージョンのCGALで機能します。窓ではありません)。長い間サポートするために、私たちの番号タイプの多くは、まだ長い間サポートしていない他のライブラリ(GMP)に基づいているため、少し待たなければならない場合があります。
Ok。私は解決策を見つけたと思います。問題は、doubleのみをサポートする正確なカーネルを使用したことでした。不正確なカーネルに切り替えると、問題が解決しました。ダブルだけ使用することも可能でした。(要件の1つは、最大2 ^ 48のインターガーをサポートするデータ型を使用することでした)。