如果我们看一下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
我知道这是有很好的理由的,但我不明白。有人能给我解释一下背后的逻辑吗?
编辑:以下是链接的摘要:
发布于 2013-07-07 16:28:28
njuffa,http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf链接的文档中确实给出了动机:
7.3.9.4 cproj函数
在复杂数学中通常使用两种拓扑:具有无限连续体的复平面和具有单一无穷大的Riemann球面。复平面更适合于超越函数,Riemann球面更适合于代数函数。具有多个无穷大的复杂类型为复杂平面提供了一个有用的(尽管不完美的)模型。cproj函数通过将所有无穷大映射到一个来帮助对Riemann球体建模,并且应该在任何操作之前使用,特别是比较,这可能会对任何其他无穷大产生虚假结果。
请注意,具有一个无限部分和一个NaN部分的复数值被视为无穷大,而不是NaN,因为如果一个部分是无限的,则该复数值是无限的,而与另一部分的值无关。出于同样的原因,如果cabs的参数包含无限部分和NaN部分,则返回无穷大。
在G.5.1中也有类似的说法:
...为了支持one-infinity模型,C99将至少有一个无穷大部分的任何复数值视为复数无穷大(即使另一部分是NaN),并保证操作和函数遵循无穷大的基本属性,并提供cproj函数将所有无穷大映射到规范无穷大。..。
相关的搜索词是" Riemann“,如Riemann sphere中的”Riemann“,这是具有单个无穷大的扩展复平面的数学模型,在Mathematica / Wolfram Alpha中使用,但在数学中并不通用。
发布于 2013-07-07 00:08:29
NaN
的一个原因是没有表示这个无穷大值所采用的“方向”。用真实的数字,lim a->inf : exp(a) -> + infinity
。定义明确的方向给出了原因的直观含义:
1/(+0) = +inf
、1.0 / (-0.0) = -inf
和:
1/(+inf) = +0
,1/(-inf) = -0
将其扩展到复杂平面:cexp([-]inf + b.I) = [-]inf.{cos(b) + I.sin(b)}
即使结果具有无限大小,仍然存在方向的概念,例如,if b = - PI/2
-> cexp(+inf + b.I) = +inf.(-I)
如果为b = [-]inf
,则接近无穷大的方向是不确定的。方向的数量是无限的,cos(b)
和sin(b)
的值是未定义的。毫不奇怪,如果参数是无穷大,则实值cos[f|l]
和sin[f|l]
函数将返回NaN
。
恐怕这不是一个非常正式的回答--只是对这个想法的一种“感觉”。我的理解是,这种行为还有其他很好的原因,比如在复杂分析中使用分支切割。
https://stackoverflow.com/questions/17503876
复制