复数乘法/除法与无穷大和南

时间:2016-09-04 16:05:01

标签: math floating-point ieee-754 complex-numbers

在实数浮点运算中,我们有附加符号INF(无穷大),NAN和有符号零。对于复杂的算术,这更加困难。如果一个人使用"天真"乘法和除法的规则

(a + ib)(c + id) = (ac - db) + i(ac+bd)
(a + ib)/(c + id) = ( (ac + db) + i(ac-bd) ) / (c*c + d*d)

对于几乎所有a,b,c,d的变量为INF或NAN的情况,都会出现错误(*)结果。

例如

  • (1 + i0)*(INF + i0)= INF + iNAN。与实际算术1 * INF = INF
  • 相比
  • (0 + i1)*(NAN + i0)= NAN + iNAN。然而,人们会期望i * NAN =(0 + iNAN)
  • 1 /(0 + 0i)= NAN + iNAN。这打破了例如z = 1 /(1 / z),这在实际算术中完美地起作用。

此列表可以轻松继续。

问题是,如何正确地实现复杂的除法和乘法,以便所有情况,包括实部或虚部之一是INF和NAN,都会给出有意义的结果?还有编程语言可以保证使用INF和NAN进行复杂算术的正确行为吗?

编辑:我想知道哪种编程语言标准(版本)确实需要使用INF和NAN进行正确的复杂算法。我最感兴趣的语言是C,C ++和FORTRAN系列。

(*)错在某种意义上说它在数学上没有意义,或者在IEEE-754意义上是反直觉的。

1 个答案:

答案 0 :(得分:3)

对于C,请查看C99或C11中的附录G.至少GCC遵循这一点,如果铿锵没有,我会感到惊讶。

对于C ++,IIRC C ++标准选择不包含C99 / C11附件G,复杂的mult / div算法可以实现。

Fortran标准没有规定必须如何实现复杂的乘法或除法。对于除法,GFortran使用常见的Smith(1962)方法,除非指定了-ffast-math,否则使用朴素算法。

有关计算复杂除法的不同算法的比较,请参阅http://arxiv.org/abs/1210.4539