Answers:
我从事实数计算工作,但愿我知道真正的答案。但是我可以推测。我认为这是一个社会问题。
从事精确实数运算的人们社区由不习惯开发软件的理论家组成。因此,他们通常将实施任务交托给学生(一个明显的例外是NorbertMüller的iRRAM),或者他们有自己的玩具实施方案。
谁的人做有没有必要的理论背景的魔力必要的程序。没有坚实的理论基础,很难正确设计出精确的实数算法。例如,在for
循环中添加许多实数是错误的,因为由于精度损失,您将获得无法接受的性能。如果要添加很多实数,则应使用树状结构,并考虑部分和的大小。这是很难得到跨越的另一件事是,<
和=
上实数总布尔函数根本不存在的(你可以有=
,但它要么退货false
或将其发散,并<
给出了两个相等的实数时发散)。
最后,我们还不清楚我们是否知道如何实现用于精确实数运算的库。它们不是通常的库,只是它们定义了一些数据类型和一些函数。通常,精确的实数运算需要特殊的控制模式。例如,iRRAM负责程序的主要执行(实际上是劫持main
)以及标准输入和输出,以便在出现精度损失时可以重新运行程序。我在Haskell中用于算术运算的库发生在Staged
monad(本质上是Reader
monad)中。大多数人期望实数“只是另一种数据类型”,但是我对此表示怀疑。
通常,人们总是关心浮点错误。但是,我不同意安德烈(Andrej)的观点,并且由于社会学原因,我不认为浮点数要优于任意精度实数(大部分情况下)。
我认为反对实数精确计算的主要论据是性能之一。因此,简短的答案是,每当性能比精度更重要时,就需要使用浮点数。
浮现在脑海中的应用是使用计算流体动力学来设计汽车或飞机的空气动力学,其中,使用许多广泛使用的处理器中的专用浮点单元所获得的天文数字,很容易弥补计算中的小误差。
特别是,使用固定数量的位表示范围广泛的实数的问题并不像乍看起来那样琐碎。在数值模拟中,值可能会相差很大(例如,在出现湍流时),因此不适合使用定点计算。
即使精度不是由硬件确定的,使用任意精度数也可能比使用浮点数慢几个数量级。实际上,即使在所有情况下所有数字都是有理数的情况下,诸如求矩阵求逆之类的简单操作也可能导致难以控制的大分母(请参阅此处的示例)。由于这个确切的问题,许多大型线性优化程序包都使用带有适当舍入模式的浮点来找到近似解(例如,请参见此处找到的大多数程序)。