实数计算:浮点对TTE对域理论对等


19

当前,大多数流行语言中的实数计算仍通过浮点运算来完成。另一方面,诸如第二类型有效性(TTE)和领域理论之类的理论早已承诺对实数进行精确计算。显然,浮点精度问题并没有因此而减少,那么为什么这些理论没有成为主流,为什么没有更加明显的实现呢?

例如,是否存在我们不太关心浮点错误的应用程序领域?是否存在重大的复杂性问题?

Answers:


17

我从事实数计算工作,但愿我知道真正的答案。但是我可以推测。我认为这是一个社会问题。

从事精确实数运算的人们社区由不习惯开发软件的理论家组成。因此,他们通常将实施任务交托给学生(一个明显的例外是NorbertMülleriRRAM),或者他们有自己的玩具实施方案

谁的人有没有必要的理论背景的魔力必要的程序。没有坚实的理论基础,很难正确设计出精确的实数算法。例如,在for循环中添加许多实数是错误的,因为由于精度损失,您将获得无法接受的性能。如果要添加很多实数,则应使用树状结构,并考虑部分和的大小。这是很难得到跨越的另一件事是,<=上实数总布尔函数根本不存在的(你可以有=,但它要么退货false或将其发散,并<给出了两个相等的实数时发散)。

最后,我们还不清楚我们是否知道如何实现用于精确实数运算的库。它们不是通常的库,只是它们定义了一些数据类型和一些函数。通常,精确的实数运算需要特殊的控制模式。例如,iRRAM负责程序的主要执行(实际上是劫持main)以及标准输入和输出,以便在出现精度损失时可以重新运行程序。我在Haskell中用于算术运算的库发生在Stagedmonad(本质上是Readermonad)中。大多数人期望实数“只是另一种数据类型”,但是我对此表示怀疑。


我几乎完全不了解确切的实数运算,但是不能在其中实现Kahan求和吗?
jjg

1
嗯,我不这么认为。可以将精确的实数算术视为间隔算术,它可以自我调整中间精度以实现所需的输出精度。
安德烈·鲍尔

3
除了缺乏程序员对实数是无限对象这一事实以及它对可以通过编程实现的后果的理解之外,我认为缺少硬件支持也很重要。很难说服人们使用大量时间和内存开销来确保正确性。
卡夫

1
我看到在使用共归类型实现实际计算中有一些活动。在我看来,共归类型要正确仍然很棘手(我当然不是专家),但是您认为这有望为更广泛地使用精确实数计算吗?
SorcererofDM 2015年

3
任何使用数字流的实现或具有固定收敛速率的任何其他实现都会从一开始就受到阻碍,因为它将收敛太慢。同样,基于流的实现往往会迫使您计算所有先前的近似值以获得下一个近似值,这也是一个设计错误。
安德烈·鲍尔

10

通常,人们总是关心浮点错误。但是,我不同意安德烈(Andrej)的观点,并且由于社会学原因,我不认为浮点数要优于任意精度实数(大部分情况下)。

我认为反对实数精确计算的主要论据是性能之一。因此,简短的答案是,每当性能比精度更重要时,就需要使用浮点数

浮现在脑海中的应用是使用计算流体动力学来设计汽车或飞机的空气动力学,其中,使用许多广泛使用的处理器中的专用浮点单元所获得的天文数字,很容易弥补计算中的小误差。

特别是,使用固定数量的位表示范围广泛的实数的问题并不像乍看起来那样琐碎。在数值模拟中,值可能会相差很大(例如,在出现湍流时),因此不适合使用定点计算。

即使精度不是由硬件确定的,使用任意精度数也可能比使用浮点数慢几个数量级。实际上,即使在所有情况下所有数字都是有理数的情况下,诸如求矩阵求逆之类的简单操作也可能导致难以控制的大分母(请参阅此处的示例)。由于这个确切的问题,许多大型线性优化程序包都使用带有适当舍入模式的浮点来找到近似解(例如,请参见此处找到的大多数程序)。


1
在某种形式的精确实数计算和浮点数计算之间是否有已证明的差距?
SorcererofDM 2015年

1
恐怕不是我所知道的。肖恩高(Sean Gao)关于逼近实数的决策过程的复杂性有一些有趣的结果(参见他的论文摘要),当然,矩阵逆的分母像其行列式一样在最坏的情况下增长。
科迪

-6

π

我的观点是,如果要精确计算,则必须为特殊名称以及熟悉的自然名称使用占位符。在某些时候,您将需要近似精确的值,以便将其应用于现实世界中的某些事物。事实证明,除非从头开始,否则从一开始就将整个问题作为一个近似值进行处理会更加有效。

[R

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.