iOS--实现复数

3
作为对这个问题的跟进:
我正在使用苹果的复数支持实现一个计算器应用程序,但我注意到如果使用该支持进行计算,将得到以下结果:
(1+i)^2=1.2246063538223773e-16 + 2i
当然,正确的等式是(1+i)^2=2i。这是更一般现象的具体例子——如果四舍五入错误将零部分舍入为略微非零的值,则会非常麻烦。
如何处理?我可以以其他方式实现复数的整数幂,但是一般问题仍将存在,而我的解决方案本身可能会导致其他不一致性。

1
我认为在计算器应用程序中,在显示结果之前,将实部和虚部都舍入(例如,保留12位小数)是合适的。 - Howard
1个回答

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接