在实浮点算法中,我们有附加符号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的意义上是违反直觉的。
发布于 2016-09-04 18:23:51
对于C,请查阅C99或C11中的附件G。至少GCC也这么做了,如果clang不这么做,我会很惊讶。
对于C++,C++标准选择了不包含C99/C11附件G,复杂mult/div的算法也可以实现。
Fortran标准没有指定必须如何实现复杂的乘法或除法。对于除法,GFortran使用常见的Smith (1962)方法,除非指定了-ffast-数学,然后使用朴素算法。
有关计算复杂除法的不同算法的比较,请参阅http://arxiv.org/abs/1210.4539。
https://stackoverflow.com/questions/39318880
复制相似问题