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

Siy*_*Ren 8 octave

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

exp(i*pi)
Run Code Online (Sandbox Code Playgroud)

结果是

ans = -1.0000e+000 + 1.2246e-016i
Run Code Online (Sandbox Code Playgroud)

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

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

Bre*_*ugh 8

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

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

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