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
我知道负数字的正奇数幂是负数,但这显然不是这里的情况:-7不是正指数,虽然如果你敞开心扉,-0确实是一个数字,但这不是一个负数。
这种行为在数学上没有意义,我也没有看到它的实际用途或技术方便,因此我怀疑规范必须依赖于历史/兼容性原因。任何见解?
答案 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 % 2
和5 % -2
都会产生1
。
当我发现它时,我有点意外,但当第一个操作数实际上可以被第二个操作数整除时,同样的规则适用:
5 % 5; // 0
-5 % 5; // -0
-5 % -5; // -0
5 % -5; // 0
......所以规则仍然完好无损。然而,更重要的原因是能够始终如一地扭转操作:如果a / b => c
,那么a / c
应该等于b
。在JS中,即使b
为Infinity
或-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
完全合理。