为什么表达式exp(i * pi)在GNU Octave中返回错误的结果?


8

我今天开始学习GNU Octave,并尝试了手册中给出的第一个表达式

exp(i*pi)

结果是

ans = -1.0000e+000 + 1.2246e-016i

似乎GNU科学图书馆也提供了类似的结果。

那么,这是Octave错误还是数字分析软件的一般问题(符号评估软件肯定会给出确切的答案)?


2
似乎八度音阶主要用于数值分析。Mathematica肯定会给您更好的答案...:P只是在开玩笑...尝试寻找GNU符号分析解决方案
gd1 2011年

@贾科莫:我知道。我只是想知道是否所有的数值分析软件都会得出这样的数字,或者仅仅是GNU Octave。
任思远

@Karsus Ren这实际上不是软件错误,而是硬件错误。在具有有限数量的单个数字存储量的硬件上尝试用无理数评估表达式是一个固有的局限性。
突破

Answers:


8

两者都不是错误,而是由于计算机执行浮点运算的方式。任何计算机都可以使用有限的精度,因此有时您会看到类似的异常情况。尽管可以编写能够处理此问题的软件,但它会花费更多的计算时间并大大增加内存需求。

如果看一下,e ^(i * pi)返回-1 + 1.2x10 ^ -16i。如您所见,虚部非常小(大多数人认为它可以忽略不计,因为它比实部小16个数量级)。由于计算本身以及pi的存储值(因为它是非理性的),舍入和精度误差引入了该组件,因为它是非理性的(请参阅此链接以获取处理非理性数字的另一个示例)。

如果此计算错误是不可接受的,则应查看执行符号分析而不是数值分析的数学软件包,或使用高精度浮点数的数学软件包。需要注意的是,它们将大大增加您的内存需求,而符号分析通常要慢得多。同样,更高的精度数字只会缩小舍入/精度误差的幅度,而不会消除它们。


1
我只需要确认这是数值分析软件的常见行为即可。
任思远

@Karsus Ren这实际上是这种软件的行为,具有足够高的精度。我知道这似乎违反直觉,但是精度较低的数字不会经常返回这些异常。有关更多详细信息,请参阅Microsoft的本文,但请记住,此问题是源代码和编译器/目标体系结构的组合。此外,这篇Wikipedia文章也提供了有关此问题的一些很好的背景信息。
突破

1
潜在的问题是Octave常数pi不是数学常数π,而是与其近似的浮点近似值。该exp函数为此添加了另一个小错误。使用符号表达式的系统可以exp(i*pi)精确计算;八度不是这样的系统。
基思·汤普森
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.