在浮点算术中,为什么数字不精确度是通过将一个小项与一个大项之差相加而导致的?


13

我一直在阅读Allen和Tildesley撰写的《液体计算机模拟》一书。从第71页开始,作者讨论了用于将牛顿运动方程式集成到分子动力学(MD)模拟中的各种算法。从第78页开始,作者讨论了Verlet算法,这也许是MD中的规范集成算法。他们声明:

也许最广泛使用的积分运动方程的方法是Verlet(1967)最初采用并归因于Stormer(Gear 1971)的方法。此方法的第二阶方程的直接溶液。该方法是基于志愿服务岗位- [R ,加速度一个,以及位置- [R - δ 从前面的步骤。推进位置的等式如下:mir¨i=fir(t)a(t)r(tδt)

(3.14)r(t+δt)=2r(t)r(tδt)+δt2a(t).

关于eqn(3.14),有几点要注意。可以看出,速度根本没有出现。通过添加关于泰勒展开式获得的方程式已消除了它们:r(t)

r(t+δt)=r(t)+δtv(t)+(1/2)δt2a(t)+...

(3.15)r(tδt)=r(t)δtv(t)+(1/2)δt2a(t)....

然后,稍后(在第80页上),作者声明:

与Verlet算法相反,...算法的形式可能会不必要地引入一些数值不精确性。这个的产生是因为,在等式(3.14),一个小项()被添加到的大项的差(øδ 0),以便产生轨迹。 O(δt2)O(δt0)

我想,“小术语”是,而“大方面差”是2 - [R - [R - δ δt2a(t)2r(t)r(tδt)

我的问题是,为什么数值不精确性是由于将一个小项加到一个大项的差中而导致的?

我对一个相当基本的概念性原因感兴趣,因为我对浮点算术的细节一点都不熟悉。另外,您是否知道任何“概述类型”的参考文献(书籍,​​文章或网站),这些参考文献会向我介绍与该问题相关的浮点算术的基本概念?谢谢你的时间。

Answers:


9

他们的观察“算法的形式可能会不必要地引入一些数值不精确性”是正确的。但它们的解释'这个的产生是因为,在等式(3.14),一个小项()被添加到的大项的差(ø δ 0),以便产生轨迹。 ``是虚假的。O(δt2)O(δt0)

xk+1=2xkxk1akk

NO(N1/2)N109

有关更多详细信息,请参见 http://en.wikipedia.org/wiki/Linear_multistep_method#Stability_and_convergence


10

如果您想找一个好的介绍,我建议戴高德伯格(David Goldberg)的《每位计算机科学家应该知道的有关浮点运算的知识》。它可能太详细了,但是可以免费在线获得。

如果您有一个好的图书馆,我建议迈克尔·奥弗顿(Michael Overton)使用IEEE浮点算术进行数值计算,或者尼克·海厄姆(Nick Higham)数值算法准确性和稳定性的前几章。

艾伦和蒂尔德斯利具体指的是数字抵消。简而言之,如果您只有三位数,并且100从中减去101,您将得到1.00(三位数)。该数字看起来可以精确到三位数,但实际上,只有第一位数为真,尾随.00为垃圾。为什么?那么,100101只的,不精确的表示说100.12345101.4321,但你只能将它们存储为三位数字。


δtr(\tδt)r(t)r(t)=1

@ArnoldNeumaier:是的,Allen和Tildesley的例子似乎没有多大意义,我只想提供一些参考,以解决“将一个[[..]]添加到一个较大的术语中时”出现的问题。 OP询问,不是给定情况下是否有问题。
2012年

但是,将一个小术语加到一个大术语上只是一个舍入误差,根本没有危险。抵消是将两个几乎相等的大项相减得到一个小项。仅当相减的中间结果远大于计算的最终结果时,或者当受取消影响的较小中间结果除以另一个较小元素时,这才成为问题。
阿诺德·诺伊迈耶

@ArnoldNeumaier:从我的回答来看,我认为这很明显,我指的是计算差异而不是总和的问题。
2012年

1
@ArnoldNeumaier:观点很明确,但是我希望你能理解我认为对于“ -1”来说这是很微不足道的。
2012年

5

(3.14)

r(t)=101
r(tδt)=100
δt2a(t)=1.49

(3.14)

r(t+δt)=103.49

但是,由于我们只能使用三位数,结果被截断为

r(t+δt)=103

a(t)r(t+20δt)=331433.90


但是效果只有3位十进制算术那么大。
阿诺德·诺伊迈耶

3

佩德罗已经给出了重要的事实,即取消。关键是您计算出的每个数字都具有相关的精度;例如,单个精度浮点数最多只能表示大约8位数的精度。如果您有两个几乎完全相同的数字,但第7位数字不同,则该差异将再次为8位单精度浮点数,看起来可以精确到8位数字,但实际上只有第一个1或2位数字是准确的,因为从中计算出的数量超出差的前1或2位数字是不准确的。

现在,您引用的这本书是1989年的书。那时,计算最经常以单精度进行,四舍五入和抵消是严重的问题。如今,大多数计算都是使用16位精度的双精度来完成的,而今天这已不再是一个难题。我认为值得一提的是,您在阅读中引用了一些段落,并结合他们的时间来理解它们。


双精度算术中的取消可能与单精度中的问题一样大。一个很好的例子就是没有枢轴的高斯消去,由于消除而导致的结果往往很差,即使是双精度也是如此。
阿诺德·诺伊迈耶

-1:Verlet公式通常保留所有位数的精度,而不只是单精度的8位数字中的1或2。
阿诺德·诺伊迈耶

@ArnoldNeumaier:当然,您可以以双精度获得相同类型的问题。我只想说的是,他们遇到的机会并不那么频繁。
Wolfgang Bangerth 2012年

如果您在一连串的计算中三次丢失6位数字,则即使以双精度计算,也已经丢失了所有数字。遭受抵消的算法即使在双精度的情况下通常也会很差。Verlet的算法有所不同,因为没有抵消,但误差出现了温和的线性增长。因此,精度损失不会成倍增加,使其适合更长的积分时间。这无疑是Allen&Tildesley所熟知的。
Arnold Neumaier 2012年

对。但是我的意思是,如果您有一个没有取消的算法,则仍然会产生单精度精度为1e-8的错误,并且如果执行1e8时间步长,那么即使其他所有条件都是正确的,也可能会出现问题。1e8时间步长可能是ODE的一个数量级。另一方面,在双精度中,您在每个步骤中的不准确性是1e-16,并且需要1e16时间步才能完全失去准确性。这是您在实践中不会遇到的许多步骤。
Wolfgang Bangerth 2012年
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.