如果我们查看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
我知道有一个很好的理由,但我不明白。有人能解释一下这背后的逻辑吗?
编辑:以下是链接摘要:
答案 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) = +inf
,1.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
,那么接近无穷大的方向是 indeterminant 。有无限多个方向,cos(b)
和sin(b)
的值未定义。毫不奇怪,如果参数是无穷大,真值cos[f|l]
和sin[f|l]
函数将返回NaN
。
这不是一个非常正式的答案,我担心 - 只是对这个想法的“感觉”。我的理解是,这种行为还有其他充分的理由,比如在复杂分析中使用分支切割。