为啥 1**Inf 的值等于 1,而不是 NaN?

Posted

技术标签:

【中文标题】为啥 1**Inf 的值等于 1,而不是 NaN?【英文标题】:Why is the value of 1**Inf equal to 1, not NaN?为什么 1**Inf 的值等于 1,而不是 NaN? 【发布时间】:2015-08-28 05:47:33 【问题描述】:

为什么是1**Inf == 1

我认为应该是NaN,就像Inf-InfInf/Inf

如何在 python 中的浮点数上实现求幂? exp(y*log(x)) 会得到正确的结果:/

【问题讨论】:

【参考方案1】:

浮点运算不是实数运算。实际分析得出的“正确”概念不一定适用于浮点数。

然而,在这种情况下,问题在于pow 从根本上代表了两个相似但不同的功能:

以整数幂取幂,自然是函数RxZ --> R(或RxN --> R)。 pow(x,y) = exp(y * log(x)) 给出的二元复函数限于实线。

这些函数在正常值上是一致的,但在零、无穷大和沿负实轴(传统上是第二个函数的分支切割)的边缘情况不同。

这两个函数有时会被分开以使边缘情况更合理;完成后,第一个函数称为pown,第二个函数称为powr;正如您所注意到的,pow 是这两个函数的合并,并对来自pown 的这些值使用边缘情况。

【讨论】:

【参考方案2】:

从数学上讲,你是对的,the value of 1 is indeterminate。

但是,在这种情况下,Python 并没有完全遵循数学。 The document of math.pow 说:

math.pow(x, y)

返回x 的幂y。例外情况尽可能遵循 C99 标准的附件‘F’。 特别是,pow(1.0, x)pow(x, 0.0) 始终返回 1.0,即使 x 是零或 NaN。

【讨论】:

【参考方案3】:

技术上 1^inf 定义为 limit(1^x, x->inf)。 1^x = 1 对于任何 x >1,所以它应该是 limit(1,x->inf) = 1,而不是 NaN

【讨论】:

eeee wut?不,它不是 O_o。 1^Inf 是不确定的,无论如何都没有定义。 看看我上面写的。 x^y 相当于 exp(y*log(x)) (我的意思是数学上)并且返回 NaN

以上是关于为啥 1**Inf 的值等于 1,而不是 NaN?的主要内容,如果未能解决你的问题,请参考以下文章

为什么 NaN 不等于自身?

为啥 NaN^0 == 1

matlab怎么计算出来的数很多都是NaN的值呢?怎么回事啊

MATLAB中出现NAN怎么回事

为啥 TensorFlow 返回 [[nan nan]] 而不是 CSV 文件中的概率?

简单c语言,为啥1/x处错误