2011-04-16 80 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