Answers:
我不同意卡夫的接受答案。对于线性编程和纳什均衡,浮点数是可以接受的。但是浮点数和计算几何结构混合得很糟:舍入误差使算法的组合假设无效,经常导致它们崩溃。更具体地说,许多计算几何算法都依赖于原始测试,该测试检查给定值是正,负还是零。如果该值非常接近零,并且浮点舍入导致其符号错误,则可能会发生不良情况。
取而代之的是,通常假定输入具有整数坐标,并且经常将中间结果准确地表示为具有足够高精度以避免溢出的有理数或代数。这些数字的浮点近似值可用于加快计算速度,但是仅在可以保证数字距离零足够远的情况下,符号测试才能给出正确的答案。
在大多数有关计算几何学的理论算法论文中,通过假设输入是精确的实数并且假定基元是输入值中低次多项式的根的符号的精确检验来回避此问题。但是,如果您要实现几何算法,那么这一切将变得非常重要。
这不是您问题的直接答案,更不是对Raphael的回应。最近已经有很多工作使用协导来指定实数计算。以下是有关该主题的一些文章。
精确实数计算的共归,Ulrich Berger和Tie Hou:计算系统理论第43卷第3-4、394-409,DOI:10.1007 / s00224-007-9017-6
精确实数运算中的共归形式推理,Milad Niqui,计算机科学中的逻辑方法,4(3:6):1–40,2008年。
它们几乎不能涵盖实数计算的全部范围,但是在解决各种问题方面正在取得进展。
Blum,Cucker,Shub和Smale考虑了实数计算的计算复杂性。这是这本书的部分描述:
古典计算理论起源于Goedel,Turing,Church和Kleene的工作,并且是理论计算机科学的非常成功的框架。但是,本书的论点是,它为现代科学计算提供了不足的基础,因为其中大多数算法都是实数算法。本书的目的是开发一种形式化的计算理论,该理论整合了经典理论的主要主题,并且更直接地适用于数学,数值分析和科学计算中的问题。在此过程中,作者考虑了以下基本问题:Mandelbrot集是否可判定?对于简单的二次映射,Julia集是否为暂停集?牛顿的真正复杂性是什么?的方法?是否有一种算法可以按逐步的步数确定背包问题?Hilbert Nullstellensatz是否难治?确定四次多项式的实零的难点是难道的吗?线性编程在实数上是否易于处理?
您可以在ACM SIGACT新闻上找到这本书的评论。
当作者在线性编程,纳什均衡计算中谈论实数输入时,...在大多数论文中(不是关于实数的计算/复杂性的论文),它们实际上并不是实数。它们是有理数和由于它们的操纵而产生的数(代数数)。因此,您可以将它们视为由有限字符串表示。
另一方面,如果本文是关于分析的可计算性和复杂性的,则他们没有使用通常的计算模型,并且存在各种不兼容的实数计算/复杂性模型。
如果本文未指定实数计算模型,则可以安全地假定这是第一种情况,即它们只是有理数。
计算几何是不同的。在CG的大多数论文中,如果作者没有指定什么模型,关于该模型的讨论是关于算法的正确性和复杂性,则可以假定它是BSS(又名real-RAM)模型。
该模型不切实际,因此实现也不简单。(这是CCA中的某些人偏爱Ko-Friedman / TTE / Domain理论模型的原因之一,但是这些模型的问题在于它们在实践中不如浮点计算那么快。) BSS模型中的算法不一定会转换为所实现算法的正确性。
Weihrauch的书包含了不同模型之间的比较(第9.8节)。它只有三页,值得一读。
(还有第三种方法,可能更适合CG,您可能需要看一下本文:
叶剑,“ 根据EGC的真实计算理论 ”
其中EGC是精确几何计算。)
通常,它们不是,也不能。我们的计算模型只能处理可数的输入(以及输出和功能)。特别是,任何输入都必须是有限的,但并非所有实数都具有有限的表示形式。
我猜,您可以假设某种预言会在请求时产生某个实数的下一位数字(例如流)。否则,您将不得不使用(任意精确的)近似值。