CGAL源码解析算术与代数篇二(数字类型——文档简析)

CGAL附带的各种数字类型本身是为了解决浮点误差的问题。

基本概念

  1. GMP 主要用于高精度整数运算
  2. MPFR 用于高精度浮点运算,支持+,-,*,/以及k次根运算
  3. LEDA 包含了基础数据类型以及一些几何数据结构
  4. 区间算术 为了处理不确定性以及浮点误差诞生的概念,一个有趣的例子区间整体的运算
  5. 神经网络区间算术的基本限制 是一个证明,有助于理解区间分析以及神经网络之间的联系
  6. 线段树 可以维护区间信息并进行相应的区间计算

文档摘要

CGAL支持的数字类型

  1. Quotient类(可以用来表示分数)
  2. MP_Float能够表示多精度浮点数值,这是整数按2的(可能是负的)次幂进行缩放的泛化。它允许处理需要有理数的浮点值上的环操作。把它代入Quotient,就得到有理数。请注意,MP_Float可能不如GMP或LEDA提供的整数类型有效

  3. Lazy_exact_nt首先尝试使用近似值来执行计算,所以它可能比NT快,可以代替NT的任意数字类型
  4. 区间运算:

    对于机器双精度数的间隔,CGAL提供了类Interval_nt。对于浮点任意精度数的间隔,CGAL提供了类Gmpfi。Gmpfi区间的端点表示为Gmpfr数。每个间隔都有一个相关的精度,这是其端点的最大精度(用于表示尾数的位数)。操作的结果保证总是包含在返回的间隔中。因为区间算法是在Gmpfr之上实现的,所以全局标志是从Gmpfr接口继承的。

  5. Sqrt_extension是一种数字类型,允许表示2阶代数数以及嵌套形式。泛型函数make_root_of_2()允许以泛型方式构建此类型。
    还提供了一个调试助手Number_type_checker<NT1,NT2,Comparator>,它允许比较两种数字类型上的操作行为。

  6. 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数字类型要求的必要函数。

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值