【问题标题】:Why cexp(+infinity+I*infinity)=+/-infinity+I*NaN in the C langage?为什么 cexp(+infinity+I*infinity)=+/-infinity+I*NaN 在 C 语言中?
【发布时间】:2013-07-06 14:27:46
【问题描述】:

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

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

编辑:这里是链接的摘要:

【问题讨论】:

  • 文档“Rationale for International Standard -- Programming Languages -- C”的第 G.5.1 节似乎包含一些有关处理包括 cexp() 在内的复杂函数的特殊值的相关 cmets。你可以在这里找到它:open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf
  • 感谢您提供此链接。这很有启发性,但它并没有带来关于案例cexp(infinity+I*infinity)的答案。
  • 我所知道的唯一解释标准委员会思考过程的文件是基本原理文件。除非您能找到相关的委员会会议记录(不知道 ISO 委员会是否提供公开记录)或可以接触到委员会成员,否则关于标准为何如此表述的问题恐怕仍然没有答案。

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


【解决方案1】:

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

7.3.9.4 cproj 函数

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

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

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

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

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

【讨论】:

    【解决方案2】:

    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] 函数会返回 NaN

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

    【讨论】:

      猜你喜欢
      • 2015-12-24
      • 2011-11-17
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 2017-07-23
      相关资源
      最近更新 更多