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

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

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

exp(i*pi)

结果是

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

而且 GNU Scientific Library 似乎也给出了类似的结果。

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

答案1

这不是两者的缺陷,而是由于计算机执行浮点运算的方式。任何计算机能够操作的精度都是有限的,所以你有时会看到这样的异常。虽然可以编写可以处理这种情况的软件,但这将花费更多的计算时间并大幅增加内存需求。

如果你看一下,e^(i*pi) 返回 -1 + 1.2x10^-16i。如你所见,虚部非常小(大多数人认为它可以忽略不计,因为它比实部小 16 个数量级)。该分量是由舍入和精度误差引入的,既有计算本身的误差,也有 pi 的存储值,因为它是无理数(见此链接另一个例子是处理无理数)。

如果这种计算错误是不可接受的,你应该研究执行符号而不是数值分析的数学包,或者使用高精度浮点数。这些的缺点是它们会大大增加你的内存需求,而符号分析通常要慢得多。此外,更高精度的数字只会缩小舍入/精度误差的幅度,不是消灭它们。

相关内容