電腦代數與符號計算

符號計算與數值計算(symbolic vs numerical computation)

假設你叫電腦算三分之一。數值的答案是 0.3333333333333333——一個快速、有限、略有偏差的小數。符號的答案則是分數 1/3,以一對整數保存,永遠精確地等於三分之一。這是用數學做計算的兩種完整風格:一種以硬體所能達到的速度玩弄近似的數,另一種像你手算那樣操弄精確的符號與公式。判斷一個任務該用哪一種,就成功了一半。

數值計算使用浮點數——固定大約十六位十進位有效位數的預算——以一個微小、可控的誤差換取龐大的速度與規模。符號計算(電腦代數)則把數學物件精確地表示:整數 1/3、符號 pi、未求值的表達式 x^2 + 2x + 1,甚至把 sqrt(2) 當成「平方後等於 2」的那個東西。它能化簡、微分、因式分解,並以封閉形式求解,給出的答案不只是接近,而是可證明地正確。代價是精確的中間結果可能在大小與時間上爆炸性成長(表達式膨脹),所以符號方法很少能擴展到數值方法輕鬆應付的大型問題。粗略的法則是:若你需要一條公式、一個證明,或完美的抵消,就用符號;若你需要從一個又大又雜的問題裡得到一個數,就用數值。

兩者沒有誰絕對較好,而最強大的工具是混合式的:先符號地推出公式,再數值地求值;或只在捨入會釀成大禍之處才動用精確算術。誠實的說法是:符號計算以可擴展性為代價買到精確,數值計算則以一個(通常極小、通常被理解的)誤差為代價買到速度與規模。把其中一者當成另一者的全面升級版,正是經典的初學者錯誤。

解 x^2 - 2 = 0。符號上答案是 x = sqrt(2) 與 x = -sqrt(2):精確,是一條你可以平方驗證的公式。數值上則是 x = 1.4142135623730951——精確到約 16 位,可立即用於計算,但它的平方是 2.0000000000000004,並非恰好為 2。同一條方程式,兩種忠實卻不同的答案。

精確公式對上快速近似——沒有誰是錯的,它們以不同方式作答。

常見的誤解是符號永遠更準、因此更好。它確實更精確,但在數值求解器幾毫秒就完成的問題上,符號方法可能慢到絕望甚至無法擴展;選錯風格是真正的工程錯誤,而非品味問題。

又称
exact vs approximate computationcomputer algebra vs floating-point精確計算與近似計算