为什么cexp(+无穷大+ I *无穷大)= + / - 无穷大+ I * NaN在C语言中?

时间:2013-07-06 14:27:47

标签: c math floating-point iso complex-numbers

如果我们查看C语言的委员会草案:n1570 特别是关于复杂数学函数行为的Annex G,我们可以看到复指数在无穷远处具有以下行为:

cexp(+infinity+I*infinity)=+/-infinity+I*NaN
(where the sign of the real part of the result is unspecified).

我的问题是:为什么?

从数学的角度来看,如果我们以相同的方式逼近实部和虚部的无穷大,则极限是复数无穷大(例如,见Wolfram Alpha),它对应于无限模数和未定义的论点。

此外,如果我们查看cexp函数的行为,它的实部和虚部相当可比(参见Wolfram Alpha上的3D图)。

所以,我原以为:

cexp(+infinity+I*infinity)=+/-infinity+/-I*infinity

而不是:

cexp(+infinity+I*infinity)=+/-infinity+I*NaN

我知道有一个很好的理由,但我不明白。有人能解释一下这背后的逻辑吗?

编辑:以下是链接摘要:

Summary

2 个答案:

答案 0 :(得分:2)

njuffa http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf链接的文件确实给出了动机:

  

7.3.9.4 cproj函数

     

复杂数学中常用两种拓扑:复杂   具有连续无穷大的平面,以及具有的无穷大球体   它的单一无限。复杂的平面更适合   超越函数,代数函数的黎曼球。   具有多个无穷大的复杂类型提供了一个   复杂平面的有用(但不完美)模型。 cproj   函数通过映射所有无穷大来帮助模拟黎曼球   一,并且应该在任何操作之前使用,尤其是   比较,可能会给任何其他人带来虚假的结果   无穷大。

     

请注意,具有一个无限部分和一个NaN部分的复数值是   被认为是无穷大,而不是NaN ,因为如果一个部分是无限的,   复数值是无限的,与另一个的值无关   部分。出于同样的原因,如果它的参数,cab返回无穷大   有无限的部分和NaN部分。

G.5.1中也有类似的评论:

  

...为了支持one-infinity模型,C99认为任何复杂   具有至少一个无限部分的值作为复数无穷大(即使   另一部分是NaN),并保证操作和功能   尊重无穷大的基本属性,并提供cproj函数   将所有无穷大映射到规范的无穷大。 ...

相关的搜索词是Riemann球体中的“Riemann”,是具有单个无穷大的扩展复平面的数学模型,在Mathematica / Wolfram Alpha中使用,但在数学中并不普遍。

答案 1 :(得分:0)

NaN的一个原因是这个无限值没有“方向”的表示。使用实数,lim a->inf : exp(a) -> + infinity。明确定义的方向为直觉提供了原因:

1/(+0) = +inf1.0 / (-0.0) = -inf和:

1/(+inf) = +01/(-inf) = -0

将其扩展到复杂平面:cexp([-]inf + b.I) = [-]inf.{cos(b) + I.sin(b)}

即使结果具有无限大小,仍然存在方向概念,例如,如果b = - PI/2 - > cexp(+inf + b.I) = +inf.(-I)

如果b = [-]inf,那么接近无穷大的方向是 indeterminant 。有无限多个方向,cos(b)sin(b)的值未定义。毫不奇怪,如果参数是无穷大,真值cos[f|l]sin[f|l]函数将返回NaN

这不是一个非常正式的答案,我担心 - 只是对这个想法的“感觉”。我的理解是,这种行为还有其他充分的理由,比如在复杂分析中使用分支切割。