iOS - 实现复杂的数字

时间:2011-04-16 12:53:46

标签: iphone ios math rounding complex-numbers

作为this question的后续行动:

我正在使用Apple's complex number support实施计算器应用程序,当我注意到如果计算使用该支持时,最终会得到以下结果:

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

当然,正确的身份是(1 + i)^ 2 = 2i。这是一个更普遍的现象的一个具体例子 - 如果将一个应该为零的部分舍入到略微非零的部分,则舍入错误可能会非常烦人。

关于如何处理这个问题的建议?我可以用其他方式实现复数的整数幂,但是一般问题仍然存在,我的解决方案本身可能导致其他不一致。

1 个答案:

答案 0 :(得分: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