为什么Math.pow(-0,-7)=== -Infinity?

时间:2014-04-03 07:33:56

标签: javascript pow

Math.pow(-0, x)是否有理由为所有负x评估无穷大,除了奇怪的是-Ifinity? 我的意思是:

Math.pow(-0, -6);          // Infinity
Math.pow(-0, -7);          // -Infinity
Math.pow(-0, -7.33);       // Infinity
Math.pow(-0, -Infinity);   // Infinity

Fiddle

我知道数字的奇数幂是负数,但这显然不是这里的情况:-7不是正指数,虽然如果你敞开心扉,-0确实是一个数字,但这不是一个负数。

这种行为在数学上没有意义,我也没有看到它的实际用途或技术方便,因此我怀疑规范必须依赖于历史/兼容性原因。任何见解?

6 个答案:

答案 0 :(得分:9)

我认为这是为了与其他负数的力量保持一致。当您将负数提高到均匀功率时,您总能获得正数结果。但是当你将负数加到奇数幂时,你会得到一个负面结果。将零增加到负功率总是会产生无穷大(因为它相当于除以零);在负零的情况下,符号与其他负数一样交替。

答案 1 :(得分:4)

请参阅Math.pow(x, -n)1/Math.pow(x, n)完全相同。你注意到负数的奇数幂是负数是非常正确的。当你做1/negative时,它显然仍是negative

但我想这个问题的关键部分是:

  

虽然-0确实是一个数字,如果你敞开心扉,它不是一个负面的。

嗯,在JavaScript中,它实际上在许多方面被视为负值 - 当然,除了与0直接比较之外。例如,Math.abs(-0)返回0,而不是-0,模数操作会保存符号:

0 % 42; // 0
-0 % 42; // -0

然而,如果你将任何正数除以0,那么你就可以获得Infinity

console.log(1/0);                // Infinity
console.log(Number.MIN_VALUE/0); // still Infinity

...但如果您将相同的数字除以-0,请猜猜是什么,您将获得-Infinity

console.log(Number.MIN_VALUE/-0); // -Infinity

当你必须在0-0之间辨别时,通常会使用此技巧 - 直接比较(0 === -0)评估为true


现在,为什么一种语言必须有正常零点的 n evil twin 否定对应物?正如@Barmar所说,一致性(最有可能)是这里的关键原因。例如,JS中有一个众所周知的规则:当你进行模运算时,结果的符号就是第一个操作数的符号。因此-5 % 2-5 % -2结果-1,而5 % 25 % -2都会产生1

当我发现它时,我有点意外,但当第一个操作数实际上可以被第二个操作数整除时,同样的规则适用:

 5 % 5;   // 0
-5 % 5;   // -0
-5 % -5;  // -0
 5 % -5;  // 0

......所以规则仍然完好无损。然而,更重要的原因是能够始终如一地扭转操作:如果a / b => c,那么a / c应该等于b。在JS中,即使bInfinity-Infinity,它也是如此,因为前者c(前者为0 -0 {{1}} 1}}在后​​者)并且将能够恢复'除数。

答案 2 :(得分:2)

怀疑此Java脚本实现使用以下逻辑:

甚至权力:

    Math.pow(-0, -6) ==       // a**(-b) == 1.0/a**b
    1.0 / Math.pow(-0, 6) ==  // (-a)**(2*b) == a**(2*b)
    1.0 / Math.pow(0, 6) ==   // 0**b == 0
    1.0 / 0.0 == 
    Infinity

对于奇数权力:

    Math.pow(-0, -7) ==       // a**(-b) == 1.0/a**b
    1.0 / Math.pow(-0, 7) ==  // (-a)**(2b+1) == -a**(2b+1) 
   -1.0 / Math.pow(0, 7) ==   // 0**b == 0
   -1.0 / 0.0 == 
   -Infinity

答案 3 :(得分:2)

documentation我们被告知以下内容:

  

如果第一个参数为负零,第二个参数为负有限奇数,或者第一个参数为负无穷大,第二个参数为正有限奇数,则结果为负无穷大。

它似乎是不同语言之间的标准,如Javascript和Java。方法本身可以有所不同,但通常它们的计算方式几乎相同。

其他人在解释它方面做得很好,但我想发布以上链接以供将来参考。

编辑:看到上面的链接是针对Java的,有些人不相信我认为它是相当标准的,请查看Javascript Reference。请注意,它实际上与上述内容相同。这是因为Math.pow()函数,无论是Java,Javascript,C ++还是其他语言,都在内部以完全相同的方式工作。您的计算机旨在以相同的方式处理这些命令,语言/编译器不会更改它。这就是为什么它们实际上是一样的。

答案 4 :(得分:1)

可能这是由于数字存储在JavaScript中的方式。虽然你说这不具有数学意义是正确的,但遗憾的是硬件和软件实际上只能做他们明确告知要做的事情。

首先让我们看看一些基本的数学。

  

x ^ -y可表示为(1 / x)^ y

     

( - x)^ y其中y为奇数,产生负结果

     

( - x)^ y其中y是偶数得到正结果

接下来,让我们考虑一些基本限制:

  

lim(x)as x-> inf = inf

     

lim(1 / x)为x-> inf = 0

     

lim(-x)as x-> inf = -inf

     

lim(1 /( - x))为x-> inf = 0

     

lim(x)为x-> 0 = 0

     

lim(1 / x)为x-> 0 = inf

     

lim(-x)为x-> 0 = -0

     

lim(1 /( - x)),其中x-> 0 = -inf

这里最有趣的是最后一个。

信息中最重要的部分是JavaScript将数字存储为带符号的数字(reference)

意思是,当评估它时(即使对我们来说0可以是负数没有意义),符号位设置为零。

当评估战俘时,它可能有一个快捷方式,可以看到x / 0 = inf。当函数返回时,它可能会计算符号位(基于顶部的数学运算),然后(使用上面的限制)将数字设置为inf。

长话短说: JavaScript将它的数字存储为已签名的双精度数。不编写语言来区分-0和+0,而乘法函数将-0和+0的符号视为任何其他数字。

希望这有帮助。

答案 5 :(得分:0)

我不同意你的陈述:"虽然-0确实是一个数字,如果你敞开心扉,它不是消极的。"

如果将-0等效为-1 / Infinity,则数学上有意义。实际上,从这个角度来看,它并不是那么容易。这是一个负数,并且可以像这个.pow()操作的负数一样进行。当你将其与Math.pow(x, -y)等于1/Math.pow(x, y)的事实结合起来时,我认为Math.pow(-0, -7) === -Infinity完全合理。