6

如果我们查看 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

我知道这是有充分理由的,但我不明白。有人可以解释一下这背后的逻辑吗?

编辑:这是链接的摘要:

概括

4

2 回答 2

2

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

7.3.9.4 cproj 函数

复杂数学中通常使用两种拓扑:具有无限连续体的复平面和具有单无穷大的黎曼球。复平面更适合超越函数,黎曼球更适合代数函数。具有无穷多重性的复数类型为复平面提供了一个有用的(尽管不完美的)模型。cproj 函数通过将所有无穷大映射到一个来帮助对黎曼球面进行建模,并且应该在任何操作之前使用,尤其是比较,这可能会对任何其他无穷大产生虚假结果。

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

G.5.1中也有类似的说法:

...为了支持一无穷大模型,C99 将任何具有至少一个无穷大部分的复数值视为复无穷大(即使另一部分是 NaN),并保证运算和函数尊重无穷大的基本性质, 并提供 cproj 函数将所有无穷大映射到规范无穷大。...

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

于 2013-07-07T16:28:28.190 回答
0

一个原因NaN是没有表示这个无限值所采用的“方向”。用实数,lim a->inf : exp(a) -> + infinity。明确定义的方向给出了一个直观的含义:

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

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

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

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

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

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

于 2013-07-07T00:08:29.303 回答