在实数浮点运算中,我们有附加符号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的情况,都会出现错误(*)结果。
例如
此列表可以轻松继续。
问题是,如何正确地实现复杂的除法和乘法,以便所有情况,包括实部或虚部之一是INF和NAN,都会给出有意义的结果?还有编程语言可以保证使用INF和NAN进行复杂算术的正确行为吗?
编辑:我想知道哪种编程语言标准(版本)确实需要使用INF和NAN进行正确的复杂算法。我最感兴趣的语言是C,C ++和FORTRAN系列。(*)错在某种意义上说它在数学上没有意义,或者在IEEE-754意义上是反直觉的。
答案 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