【问题标题】:Why does Math.pow(1, Infinity) return NaN?为什么 Math.pow(1, Infinity) 返回 NaN?
【发布时间】:2012-09-01 21:57:12
【问题描述】:

我一直认为 1 的任何幂都等于 1,但 Math.pow(1, Infinity) 返回 NaN。为什么不是 1?

【问题讨论】:

  • 这是 Javascript 大神想要的样子
  • 不仅仅是 JavaScript。这就是数学的定义方式。
  • 其实,我希望这是IEEE754大神定义它​​的方式......
  • 是的。数学之神 > Javascript之神:P
  • 实际上,pow 的这种行为 在 2008 年的 IEEE-754 中定义(它还定义了与 qNaN 相关的),但是,要找到一个真正的 IEEE-754参考是..不容易。此外,不同的编程语言(例如 C 和 Java)的实现/要求也不同。

标签: javascript


【解决方案1】:

这更像是一道数学题而不是 Javascript 题,因此您可以使用以下数学解释 (http://mathforum.org/library/drmath/view/53372.html):

当你有“无限”之类的东西时,你必须意识到它是 不是数字。通常你的意思是某种限制过程。 因此,如果您拥有“1^infinity”,那么您真正拥有的是某种限制: 基数不是真正的 1,但可能越来越接近 1 而指数越来越大,比如可能是 (x+1)^(1/x) 为 x->0+。

问题是,发生得更快,基地越来越接近 1 还是指数变大?要找出答案,让我们致电:

L = lim x->0 of (x+1)^(1/x)

然后:

ln L = lim x->0 of (1/x) ln (x+1) = lim x->0 of ln(x+1) / x

那是什么?由于 x->0 它是 0/0 形式,所以取 顶部和底部。然后我们得到 lim x->0 of 1/(x+1) / 1,这 = 1。 所以 ln L = 1,并且 L = e。酷!

这是真的吗?尝试插入一个很大的 x 值。或者认出这个 极限作为 e 定义的变体。不管怎样,这是真的。这 limit 是 1^infinity 形式,但在这种情况下它是 e,而不是 1。试试 在指数中使用 (2/x) 或使用 (1/x^2) 或使用 1/(sqrt(x)),看看它如何改变答案。

这就是我们称之为不确定的原因——所有这些不同版本的 极限接近 1^infinity,但最终答案可能是任何 数字,例如 1、无穷大或未定义。你需要做更多的工作 来确定答案,所以 1^infinity 本身尚未确定。 换句话说,1 只是 1^infinity 的答案之一。

“不确定”的答案不是数字。

【讨论】:

【解决方案2】:

特别是对于 JS,它在标准中定义,ECMAScript-262 5th Edition,第 163 页:

如果 abs(x)==1 且 y 为 +∞,则结果为 NaN

原因是无限只有在有限制的情况下才有意义。

所以

lim 1^x -> ∞
x->∞

但是1^∞ 是未定义的(对于编程语言。对于数学,它被定义并表示为一个限制)

【讨论】:

  • 极限将写为 lim 1^x 其中 x 接近无穷大。你的数学很差。任何有限幂的统一性肯定是明确定义的,并且柯西序列会将极限定义为与预期的一样。
  • @shawnt00:实际上我在等待这条评论 :-) 我可以尝试以正确的方式编写它,但我不知道正确格式的可读形式。纸上谈兵很容易,但这里不是
  • 我没有对符号提出小问题。你的推理完全错误。
  • @shawnt00:现在有意义吗?
  • @shawnt00:嗯,从数学的角度来看 - 这是不正确的,但在 js 中你不能将结果表示为限制
【解决方案3】:

IEEE 754-2008 定义: 1^(+-)Inf = +1

您使用的语言不符合标准。

【讨论】:

    【解决方案4】:

    jeff 的回答很好,但它说:

    当你有“无限”之类的东西时,你必须意识到它是 不是数字。通常你的意思是某种限制过程。 因此,如果您拥有“1^infinity”,那么您真正拥有的是某种 限制:基数不是真正的 1,而是越来越接近 1 也许当指数变得越来越大时,就像也许 (x+1)^(1/x) 为 x->0+。

    好吧,如果你有1^∞,当然指数不能完全是,因为它不是一个实数。但基数可以一直为 1。

    那么,

    lim   (x^y) = (1)^(∞) = ?? undefined ??
    x->1
    y->∞
    

    但是

    lim  (1^y) = 1^(∞) = 1
    y->∞
    

    (括号表示法表示括号内的部分是收敛到那个数的数列,但不是那个数)

    那么,我认为如果 Javascript 有一个整数类型,Math.pow( (int)1, Infinity) 应该给1

    但事实是 (https://stackoverflow.com/a/3605946/1529630)

    JavaScript 中的所有数字都是 64 位浮点数。

    那么,(http://en.wikipedia.org/wiki/Double-precision_floating-point_format),由于 IEEE 754 双精度二进制浮点数的有效位为 53 位(52 位显式存储),

    因此总精度为 53 位(大约 16 个十进制数字,53 log10(2) ≈ 15.955)

    所以当我们执行Math.pow(1,Infinity) 时,1 不完全是 1。

    那么,Math.pow(1,Infinity)NaN 是有道理的

    【讨论】:

    • 嗯? IEEE 754 1 正好是 1。
    • @Bergi 我的意思是,由于存在精度误差,存储为 1 的数字并不总是 1 的数学概念
    猜你喜欢
    • 2016-11-16
    • 2015-12-24
    • 1970-01-01
    • 2011-11-17
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2017-05-10
    相关资源
    最近更新 更多