2011-04-16 32 views
3

作爲後續this question的iOS - 實現複數

我是在用Apple's complex number support時,我注意到,如果一個計算使用的支持,一個具有下列最終實現一個計算器應用程序的過程:

(1 + I)^ 2 = 1.2246063538223773e-16 + 2I

當然正確的身份是(1 + I)^ 2 = 2I。這是一個更普遍現象的具體例子 - 如果舍入誤差可能令人討厭,如果他們將一個應該爲零的部分舍入到略微非零的部分。

關於如何處理這個問題的建議?我可以通過其他方式實現複數的整數次冪,但一般問題仍然存在,而我的解決方案本身可能會導致其他不一致。

+1

我認爲,在一個計算器應用程序適合在顯示結果之前舍入實部和虛部(例如12位十進制數字)。 – Howard 2011-04-16 13:13:54

回答

3

如您所見,這是浮點標準舍入錯誤問題。 @Howard指出,在顯示之前,你應該將你的雙重結果回到浮動範圍。

我通常使用FLT_EPSILON來幫助我處理這些事情。

#define fequal(a,b) (fabs((a) - (b)) < FLT_EPSILON) 
#define fequalzero(a) (fabs(a) < FLT_EPSILON) 

有了這些,你可能會喜歡這樣的功能(未經測試)

inline void froundzero(a) { if (fequalzero(a)) a = 0; } 

複雜的版本就留給讀者做練習,因爲他們說:d