Javascript 为什么数学是无穷大?
对于所有负的Javascript 为什么数学是无穷大?,javascript,pow,Javascript,Pow,对于所有负的x,除了-Infinity时的奇数之外,Math.pow(-0,x)计算到无穷大是否有理由? 我的意思是: 我知道负数的正奇数幂是负的,但这里的情况显然不是这样,-7不是正指数,-0确实是一个数字,如果你敞开心扉,它不是负指数 这种行为在数学上毫无意义,我也看不到它的实际用途或技术便利性,因此我怀疑该规范必须依赖于历史/兼容性原因。有什么见解吗?怀疑此Java脚本实现使用了以下逻辑: 对于偶数权力: 对于奇数幂: 请看,Math.pow(x,-n)实际上与1/Math.pow(x,
x
,除了-Infinity时的奇数之外,Math.pow(-0,x)
计算到无穷大是否有理由?
我的意思是:
我知道负数的正奇数幂是负的,但这里的情况显然不是这样,-7不是正指数,-0确实是一个数字,如果你敞开心扉,它不是负指数
这种行为在数学上毫无意义,我也看不到它的实际用途或技术便利性,因此我怀疑该规范必须依赖于历史/兼容性原因。有什么见解吗?怀疑此Java脚本实现使用了以下逻辑: 对于偶数权力: 对于奇数幂: 请看,
Math.pow(x,-n)
实际上与1/Math.pow(x,n)
相同。你很正确地注意到负数的奇数幂是负数。当你做1/否定
,显然它仍然是否定
但我想问题的关键在于:
如果你敞开心扉的话,-0确实是一个数字,但它不是一个负数
在JavaScript中,它实际上在很多方面都被视为负值——当然,除了直接与0比较之外。例如,Math.abs(-0)
返回0
,而不是-0
,模运算保存符号:
0 % 42; // 0
-0 % 42; // -0
然而,有一个技巧与众不同:如果你将任何正数除以0
,你将得到无穷大:
console.log(1/0); // Infinity
console.log(Number.MIN_VALUE/0); // still Infinity
console.log(Number.MIN_VALUE/-0); // -Infinity
。。。但是如果你把同一个数字除以-0
,你猜怎么着,你会得到-Infinity
:
console.log(1/0); // Infinity
console.log(Number.MIN_VALUE/0); // still Infinity
console.log(Number.MIN_VALUE/-0); // -Infinity
当您只需在0
和-0
之间进行区分时,通常会使用此技巧,因为直接比较(0===-0
)的计算结果为true
现在,为什么一种语言必须有一个邪恶的孪生负相对应的正常零?正如@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
是无穷大
或-无穷大
也是如此,因为你会得到不同的c
(0
,前者是-0
,后者是-0
),并且能够“恢复”除数。我相信这是为了与其他负数的幂保持一致。当你把一个负数提高到偶数次方时,你总是得到一个正的结果。但是当你把一个负数提高到奇数次方时,你会得到一个负的结果。将零提高到负幂总是导致无穷大(因为它等于除以零);在负零的情况下,符号与其他负数一样交替出现。这可能是由于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)作为x->inf=-inf
lim(1/(-x))as x->inf=0
lim(x)as x->0=0
lim(1/x)为x->0=inf
lim(-x)为x->0=-0
lim(1/(-x))作为x->0=-inf
这里最有趣的是最后一个
不过,信息中最重要的部分是JavaScript将数字存储为带符号的数字
也就是说,当对其进行计算时(即使我们认为0可能是负数没有意义),符号位被设置为0
在计算pow时,它可能有一个快捷方式来查看x/0=inf。当函数返回时,它可能会计算符号位(基于顶部的数学),然后(使用上面的限制)将数字设置为inf
长话短说:
JavaScript将其数字存储为带符号的双精度数字。这种语言不是用来区分-0和+0的,乘法函数将-0和+0中的符号与任何其他数字一样处理
希望这能有所帮助。我们被告知如下:
如果第一个参数为负零,第二个参数为负有限奇数整数,或者第一个参数为负无穷大,第二个参数为正有限奇数整数,则结果为负无穷大
在不同的语言之间,如Javascript和Java,它似乎是相当标准的。这些方法本身可能不同,但通常计算它们的方式基本相同
其他人对此做了很好的解释,但我想发布上面的链接供将来参考
编辑:鉴于上面的链接是针对Java的,有些人不相信我说它是相当标准的,请查看此链接。请注意,它实际上与上述内容相同。这是因为Max.PUE()函数,无论是在爪哇、JavaScript、C++还是另一种语言中,都以相同的方式在内部工作。您的计算机设计为以相同的方式处理这些命令,语言/编译器不会改变这一点。这就是为什么它们实际上是一样的。I dis
5 % 5; // 0
-5 % 5; // -0
-5 % -5; // -0
5 % -5; // 0