具有无穷大和 nan 的复数乘法/除法

问题描述 投票:0回答:1

在真正的浮点运算中,我们有附加符号 INF(无穷大)、NAN 和有符号零。对于复杂的算术来说,这更加困难。如果使用“天真的”规则进行乘法和除法

(a + ib)(c + id) = (ac - db) + i(bc+ad)
(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 。 与实际算术相比 1INF = 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 意义上是反直觉的。

math floating-point ieee-754 complex-numbers
1个回答
4
投票

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

对于 C++,IIRC C++ 标准选择不合并 C99/C11 附录 G,复杂的 mult/div 算法取决于实现。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.