“所有分支采用 精确有理谓词。每个候选点由至多两条原边界或形式框边界求交得到,二维公式与每条原行的比较只涉及常数个输入系数。输入每数至多 $L$ 位时,约分后的几何数、形式系数和 $M 0$…”
形式陈述
几何算法的正确性要求组合分支符合所声明的精确输入与输出规格。输入可用整数、有理数,或把有限二进制浮点值视作精确的二进有理数;NaN 与无穷不属于这里的有限平面坐标。在浮点数系统上实现快速路径时,有限个谓词的符号常决定组合结构,例如
精确几何计算原则要求:只要输入坐标被模型精确表示,算法用于分支的谓词符号必须与相应实数或整数表达式的数学符号一致。构造出的交点、距离或坐标可以近似,但任何会改变拓扑或组合结构的分支不得由未经误差控制的浮点近似决定。
一种常见过滤框架是:
- 用普通浮点快速计算近似值
; - 同时计算可靠误差界
; - 若
,直接返回其符号; - 否则转入能确定包括零在内的精确符号后端,例如对这些有限整数或有理输入计算精确展开;也可先提高精度,再在仍不确定时回退。
例如验证区间算术可给出包含真值的区间
该接口返回的是符号证书,而不是“看起来足够精确”的数值。
直觉
几何算法的坐标误差通常是连续的,但组合错误是离散的。一个接近零的方向行列式若被判错,可能把左转当成右转,造成边相交、面方向颠倒、搜索循环或不合法三角剖分。提高固定浮点位数只能推迟失败,不能覆盖任意接近退化的输入。
过滤器把常见易判输入留给硬件浮点,把真正困难的近退化输入送到高精度后端,因此可以同时获得通常速度与最坏正确性。
例子与边界
三点坐标规模很大而几乎共线时,方向行列式由两个大乘积相减得到很小结果。双精度可能把正值舍入成零或负值;仅比较 abs(det) < 1e-9 也没有尺度不变性。可靠过滤界必须由每次算术误差传播得到。
Delaunay 构造中的四点近共圆情况同样敏感。若相邻三角形对同一边给出不一致的 in-circle 符号,edge flip 过程可能来回振荡。自适应精确谓词可保证双方共享同一数学判定。
精确谓词不自动解决输入建模问题。十进制测量值读入二进制浮点后,算法精确回答的是这些二进制数所定义的几何,而非不可知的真实物理坐标。共线、共圆等退化还需要一致的 tie-breaking、symbolic perturbation 或多值输出策略。
推论与应用
方向判定、内接圆判定、线段相交、凸包和点定位都可采用同一过滤接口。算法证明可假设谓词返回数学正确符号,数值实现则独立负责保证这个精确符号约定。
精确构造与精确判定应分层。许多算法只需精确决定组合结构,最终展示坐标可用受控近似;若输出本身将继续参与后续谓词,则还必须采用能保持代数一致性的构造表示。
参考资料
- Christoph M. Hoffmann, Geometric and Solid Modeling, Morgan Kaufmann, 1989, Chapter 4.
- Jonathan Richard Shewchuk, “Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates,” Discrete & Computational Geometry 18, 1997.
- Kurt Mehlhorn and Stefan Näher, “LEDA: A Platform for Combinatorial and Geometric Computing,” Communications of the ACM 38(1), 1995.