Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么数学是无穷大?_Javascript_Pow - Fatal编程技术网

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