今天開始學習GNU Octave,嘗試了手冊中給出的第一個表達式
exp(i*pi)
結果是
ans = -1.0000e+000 + 1.2246e-016i
GNU 科學圖書館似乎也給出了類似的結果。
那麼這是一個Octave bug,還是數值分析軟體的一般問題(符號評估軟體一定會給出精確的答案)?
答案1
這不是兩者的錯誤,而是由於計算機執行浮點運算的方式造成的。任何計算機的操作精度都是有限的,因此有時您會看到這樣的異常情況。雖然可以編寫可以處理此問題的軟體,但這將花費更多的計算時間並大大增加記憶體需求。
如果你看一下,e^(i*pi) 回傳 -1 + 1.2x10^-16i。正如您所看到的,虛部非常小(大多數人會認為它可以忽略不計,因為它比實部小 16 個數量級)。此分量是由舍入和精度誤差引入的,既與計算本身有關,也與 pi 的儲存值有關,因為它是無理數的(請參閱這個連結另一個處理無理數的例子)。
如果這種計算錯誤是不可接受的,您應該研究執行符號分析而不是數值分析的數學包,或使用高精度浮點數。需要注意的是,它們會大大增加您的記憶體需求,符號分析通常要慢得多。此外,更高精度的數字只會縮小捨去/精度誤差的幅度,不是消滅他們。