首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有无穷大和nan的复乘法/除数

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

Stack Overflow用户
提问于 2016-09-04 16:05:00
回答 1查看 911关注 0票数 3

在实浮点算法中,我们有附加符号INF (无穷大)、NAN和符号零。对于复杂的算术,这是更困难的。如果一个人使用“朴素”规则进行乘法和除法

代码语言:javascript
运行
复制
(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的意义上是违反直觉的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39318880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档