【发布时间】:2016-09-05 02:28:52
【问题描述】:
在实数浮点运算中,我们有附加符号 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 的意义上是违反直觉的。
【问题讨论】:
-
在什么情况下?什么语言? Here 是 clang 的 C++
<complex>实现。如果您查看operator *实现,它会演示如何处理 INF/NaN。不同意什么? -
他们似乎做得对。感谢您的链接。我的问题是哪种语言可以保证它。即规范要求使用哪种语言正确的 INF 和 NAN 行为。据我所知,C++ 并非如此(但我可能是错的)。 FORTRAN 似乎也不需要它。在这里我想澄清一下。
-
问题是,如果你想编写依赖于处理 INF 和 NAN 的可移植代码,如果一些编译器做对了,而另一些编译器做错了,那是毫无意义的。
标签: math floating-point ieee-754 complex-numbers