在实际的浮点数算法中,我们有额外的符号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的意义上是反直觉的。
<complex>
实现。如果您查看operator *
实现,它展示了如何处理INF/NaN。您对此有什么异议吗? - Brett Hale