CGAL附带的各种数字类型本身是为了解决浮点误差的问题。
基本概念
- GMP 主要用于高精度整数运算
- MPFR 用于高精度浮点运算,支持+,-,*,/以及k次根运算
- LEDA 包含了基础数据类型以及一些几何数据结构
- 区间算术 为了处理不确定性以及浮点误差诞生的概念,一个有趣的例子区间整体的运算
- 神经网络区间算术的基本限制 是一个证明,有助于理解区间分析以及神经网络之间的联系
- 线段树 可以维护区间信息并进行相应的区间计算
文档摘要
CGAL支持的数字类型
- Quotient类(可以用来表示分数)
-
MP_Float能够表示多精度浮点数值,这是整数按2的(可能是负的)次幂进行缩放的泛化。它允许处理需要有理数的浮点值上的环操作。把它代入Quotient,就得到有理数。请注意,MP_Float可能不如GMP或LEDA提供的整数类型有效
- Lazy_exact_nt首先尝试使用近似值来执行计算,所以它可能比NT快,可以代替NT的任意数字类型
- 区间运算:
对于机器双精度数的间隔,CGAL提供了类Interval_nt。对于浮点任意精度数的间隔,CGAL提供了类Gmpfi。Gmpfi区间的端点表示为Gmpfr数。每个间隔都有一个相关的精度,这是其端点的最大精度(用于表示尾数的位数)。操作的结果保证总是包含在返回的间隔中。因为区间算法是在Gmpfr之上实现的,所以全局标志是从Gmpfr接口继承的。
-
Sqrt_extension是一种数字类型,允许表示2阶代数数以及嵌套形式。泛型函数make_root_of_2()允许以泛型方式构建此类型。
还提供了一个调试助手Number_type_checker<NT1,NT2,Comparator>,它允许比较两种数字类型上的操作行为。 - Core与LEDA功能相同
GMP支持的数字类型
CGAL对GMP进行了封装:
CGAL/Gmpz.h提供了类Gmpz,这是任意精度整数类型mpz_t的包装类
文件CGAL/Gmpq.h提供了类Gmpq,这是任意精度有理数类型mpq_t的包装类
文件CGAL/Gmpfr.h提供了类Gmpfr,这是一种固定精度的浮点数类型
文件CGAL/Gmpzf.h提供了类Gmpzf,这是一个精确的任意精度浮点类型。因此,它不支持像/这样的操作符来保证操作的准确性。此类型的算术运算仅限于+、-、*和integral_division()。在某些平台上,文件CGAL/Mpzf.h提供了类Mpzf,这是Gmpzf的一个更快的替代方案,但不支持integral_division()
此外,还可以直接使用GMP提供的c++数字类型:mpz_class, mpq_class(注意对mpf_class的支持是不完整的)。文件CGAL/gmpxx.h提供了使这些类符合CGAL编号类型要求的必要函数。
LEDA支持的数字类型
LEDA提供的数字类型可用于笛卡尔和齐次表示的精确计算。LEDA中最复杂的数字类型是称为leda_real的数字类型。与Pascal中使用real这个名称表示浮点数一样,leda_real这个名称并没有精确地描述数字类型,而是有意为之。Leda_real是实数代数的子集。任何整数都是leda_real,并且leda_real在运算+,−,*,/和k次根计算下是封闭的。对于LEDA 5.0或更高版本,leda_real也能够表示多项式的实数根。leda_real保证所有涉及leda_real的表达式之间的比较都会产生确切的结果
文件CGAL/leda_integer.h、CGAL/leda_rational.h、CGAL/leda_bigfloat.h和CGAL/leda_real.h提供了使这些类符合CGAL数字类型要求的必要函数。