为什么 pow(-infinity, positive non-integer) 会等于 +infinity?

14
C99附录F(IEEE浮点数支持)如下所述:

pow(−∞, y)在y > 0且不是奇整数的情况下返回+∞。

然而,例如(−∞)0.5实际上具有虚数值±∞i,而不是+∞。 C99自己的sqrt(−∞)如预期的那样返回NaN并生成域错误。那么为什么pow要求返回+∞?
(大多数其他语言直接使用C库,或者像Python一样复制符合标准所需的行为,因此实际上这影响不仅仅是C99。)

1
我不确定你所说的“−∞<sup>0.5</sup> 实际上是无穷大的虚数 ∞i”是什么意思,虚数从哪里来? - Oliver Charlesworth
2
@OliCharlesworth 标准数学 - 对负数进行平方根运算将得到一个虚数。 - Alnitak
2
@Alnitak:我不确定像“∞i”这样的概念是否特别有意义... - Oliver Charlesworth
1
@Alnitak:嗯,标准的复分析有扩展复平面,它有一个无穷大的单一值... - Oliver Charlesworth
标准的C库不支持虚数。 - std''OrgnlDave
显示剩余6条评论
1个回答

17

对于奇整数y,定义如下:

pow(±0, y) = ±0

毕竟,将数值用奇次幂运算,总是会保留其符号。如果可以保留零的符号,那我们就应该这样做。对于正的整数y,我们应该定义:

pow(±0, y) = +0.
符号未定义。但是,我们不会将其设置为NaN,因为对于-0,与不将sqrt(-0)设置为NaN相同的原因是:这没有意义。(顺便说一句,这也是IEEE-754-2008标准第9.2.1节中定义的方式。)
由于1/±0 = ±∞,而数学上来说,
pow(x,y) = 1/pow(1/x,y)

在上述情况下,将x=±∞设定后,结果如下:

pow(±∞,y) = 1/pow(±0,y) = 1/+0 = +∞

对于正的非整数y


如果您认为(±1)/0 = ±∞,那么考虑“-0”是相同的实数“0”,会怎样呢? - Heath Hunnicutt
@HeathHunnicutt (-inf)^(1/2) = (-1/0)^(1/2) = (-1)^(1/2)/0 = nan/0 = nan - Chortos-2
2
这将问题转移到“为什么需要-0?”嗯,一个原因是-0表示从下方的下溢。另一个原因是,复平面中的分支切割,按照传统的定义,与-0一起按预期工作。 - Jeffrey Sax
我仍然不同意关于 pow(−∞, y) 的标准(除了两个复数根之外还能得出正无穷大,这应该进一步支持将其定义为 NaN),但这解释了标准行为的来源(或可能来源)。谢谢! - Chortos-2
+1,IEEE选择以这种方式定义pow对我来说并没有太多意义,但这是我看到的第一个比较合理的论点。 - R.. GitHub STOP HELPING ICE
@JeffreySax:我一直认为如果IEEE-754有正无穷小和负无穷小(我称之为ptiny和ntiny),以及无符号无穷小(utiny)和可能的“真”零,那么它会更加清晰。这将允许一致和对称地处理与零相关的公理(包括x + 0,0 + x和x等价)。唯一需要区分无符号无穷小和真零的情况是添加到有符号无穷小时。将ptiny添加到utiny应产生utiny,但ptiny + 0应产生ptiny。 - supercat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接