JavaScript 中的数字能否在运行时达到无穷大?
Can a number in JavaScript ever reach to Infinity in runtime?
我只是好奇,JavaScript 中的数字是否可以达到 Infinity
。
JavaScript数的范围已经足够了——2的64次方不同的数,大约是18昆体( 18 后面有 18 个零)。好多啊。
现在,我有几个问题:
- 当数字超出该范围时会发生什么? JavaScript 会把它称为新的
Infinity
号码吗?
- JavaScript 中有哪些场景可以在运行时将值
Infinity
赋值给变量?
让我们看一个代码示例,
正在尝试编写一个方法 incrementNumToInfinity()
来递增一定次数的值,以便 a === b
可以评估为 true
(同时,查看其他可能的情况,其中 JavaScript 引擎可以在运行时将值 Infinity
分配给变量)。
var a = 1000; // a positive number
var b = Infinity;
console.log(a === b); // It returns false, that's expected
function incrementNumToInfinity(num) {
// Logic to convert our variable num into Infinity
return num;
};
a = incrementNumToInfinity(a); // Input: 1000, Expected output: Infinity
console.log(a === b); // Should return true
广告 2:
What are all the scenarios in JavaScript, where the value Infinity
could be assigned to a variable in runtime?
你可以用零除。
var x = 1 / 0;
console.log(x);
Can a number in JavaScript ever reach to Infinity in runtime?
假设你的程序没有内存泄漏。我相信它可以达到无限。
console.log(Number.MAX_SAFE_INTEGER)
// 9007199254740991
console.log(Number.MAX_VALUE)
// 1.7976931348623157e+308
var i = Number.MAX_SAFE_INTEGER
while (i != Infinity) {
i += Math.pow(10, 307)
console.log(i)
}
// 1.0000000000000005e+307
// 2.000000000000001e+307
// 3.0000000000000013e+307
// 4.000000000000002e+307
// 5.000000000000002e+307
// 6.000000000000003e+307
// 7.000000000000003e+307
// 8.000000000000004e+307
// 9.000000000000004e+307
// 1.0000000000000004e+308
// 1.1000000000000004e+308
// 1.2000000000000003e+308
// 1.3000000000000003e+308
// 1.4000000000000003e+308
// 1.5000000000000002e+308
// 1.6000000000000002e+308
// 1.7000000000000001e+308
// Infinity
Can a number in JavaScript ever reach to Infinity in runtime?
有可能在 运行 时得到一个数字,它是计算的结果,其值为 Infinity
。 Nina Scholz 有 一个这样的案例:如果你这样做 x = 1 / 0
,x
将有价值 Infinity
.
What would really happen when a number grows beyond that range [i.e beyond the range JavaScript can handle]? Would JavaScript refer it as a new Infinity
number?
我们可以试试。 Number.MAX_VALUE
是JavaScript可以表示的最大浮点数。如果你 运行 这个:
Number.MAX_VALUE + 1
你得到了一个很大的数字,但不是 Infinity
。那里发生了什么事?嗯,凭直觉让我们试试这个:
Number.MAX_VALUE + 1 === Number.MAX_VALUE
结果是true
。说什么?问题是浮点数的精度有限,当我将 1 添加到 Number.MAX_VALUE
时,没有足够的精度来注册增量。
如果你试试这个:
Number.MAX_VALUE * 2
然后你得到 Infinity
.
What are all the scenarios in JavaScript, where the value Infinity could be assigned to a variable in runtime?
“所有场景”...嗯...生成所有场景的枚举存在多个问题。一方面,尚不清楚应以何种标准将一种情况与另一种情况区分开来。 -Math.log(0)
与 1 / 0
是不同的场景吗?如果是这样,为什么?然后是 JavaScript 引擎有相当多的回旋余地来实现数学函数的问题。例如,Math.tan
在 current draft 中这样指定:
Math.tan(x)
Returns an implementation-dependent approximation to the tangent of x
. The argument is expressed in radians.
If x
is NaN
, the result is NaN
.
If x
is +0
, the result is +0
.
If x
is -0
, the result is -0
.
If x
is +∞
or -∞
, the result is NaN
.
它不强制要求 Math.tan(Math.PI / 2)
的值如果您还记得三角函数 类,pi / 2
是 90 度,在该角度切线是无限大。 v8 的各种版本都返回了 Infinity
或一个非常大的正数。 (参见 this question。)规范并不强制要求一个结果优于另一个结果:实现可以自由选择。
所以实际上,如果你从一组你知道数学上应该产生 Infinity
的案例开始,你不知道它们是否 会 实际产生,直到你试试看。
关于 incrementNumToInfinity
函数的问题部分我不是很清楚。您似乎在问是否可以通过增加一个数字来达到无穷大。这取决于你的意思。如果你是这个意思:
let x = 0;
while (x !== Infinity) {
x++;
}
这将永远不会终止。 x
永远不会超过 Number.MAX_SAFE_INTEGER + 1
。所以它不会达到 Infinity
。试试这个:
let x = Number.MAX_SAFE_INTEGER + 1;
x === x + 1;
您将得到结果 true
。这又是 运行 精度问题。 1 的增量不足以在您可用的精度范围内产生差异。
将增量更改为 2、5、10 或 10000000 并不能真正解决问题,它只是改变了在增量不再产生任何影响之前可以走多远。
一个平方的平方根乘以同一个平方的 PI 的比率减去 PI 以解释接近无穷大时的无限衰减,等于无穷大。或者同时证明阿基米德的错误和正确。 PI 和平方是等价的,因为它们永远都不会达到 0。这种现象也解释了毕达哥拉斯理论中的零边界,其中 A 平方 + B 平方 = c 平方接近无穷大。
Math.sqrt(1) / (Math.PI * ((Math.sqrt(1))) - Math.PI)
这是狐狸和鸭子之谜的结果。当鸭子移动到池塘距离的 1r 时,狐狸移动 180 度或其对角和相邻角的平方和,我们得到平方 2^2(距池塘中心的行进距离)平方根PI 与给定的 1:4 比率因此三角形在 pi - pi = Infinity 上的低张力或在任何特定点与相反矢量的 1:1 关系。
我只是好奇,JavaScript 中的数字是否可以达到 Infinity
。
JavaScript数的范围已经足够了——2的64次方不同的数,大约是18昆体( 18 后面有 18 个零)。好多啊。
现在,我有几个问题:
- 当数字超出该范围时会发生什么? JavaScript 会把它称为新的
Infinity
号码吗? - JavaScript 中有哪些场景可以在运行时将值
Infinity
赋值给变量?
让我们看一个代码示例,
正在尝试编写一个方法 incrementNumToInfinity()
来递增一定次数的值,以便 a === b
可以评估为 true
(同时,查看其他可能的情况,其中 JavaScript 引擎可以在运行时将值 Infinity
分配给变量)。
var a = 1000; // a positive number
var b = Infinity;
console.log(a === b); // It returns false, that's expected
function incrementNumToInfinity(num) {
// Logic to convert our variable num into Infinity
return num;
};
a = incrementNumToInfinity(a); // Input: 1000, Expected output: Infinity
console.log(a === b); // Should return true
广告 2:
What are all the scenarios in JavaScript, where the value
Infinity
could be assigned to a variable in runtime?
你可以用零除。
var x = 1 / 0;
console.log(x);
Can a number in JavaScript ever reach to Infinity in runtime?
假设你的程序没有内存泄漏。我相信它可以达到无限。
console.log(Number.MAX_SAFE_INTEGER)
// 9007199254740991
console.log(Number.MAX_VALUE)
// 1.7976931348623157e+308
var i = Number.MAX_SAFE_INTEGER
while (i != Infinity) {
i += Math.pow(10, 307)
console.log(i)
}
// 1.0000000000000005e+307
// 2.000000000000001e+307
// 3.0000000000000013e+307
// 4.000000000000002e+307
// 5.000000000000002e+307
// 6.000000000000003e+307
// 7.000000000000003e+307
// 8.000000000000004e+307
// 9.000000000000004e+307
// 1.0000000000000004e+308
// 1.1000000000000004e+308
// 1.2000000000000003e+308
// 1.3000000000000003e+308
// 1.4000000000000003e+308
// 1.5000000000000002e+308
// 1.6000000000000002e+308
// 1.7000000000000001e+308
// Infinity
Can a number in JavaScript ever reach to Infinity in runtime?
有可能在 运行 时得到一个数字,它是计算的结果,其值为 Infinity
。 Nina Scholz 有 x = 1 / 0
,x
将有价值 Infinity
.
What would really happen when a number grows beyond that range [i.e beyond the range JavaScript can handle]? Would JavaScript refer it as a new
Infinity
number?
我们可以试试。 Number.MAX_VALUE
是JavaScript可以表示的最大浮点数。如果你 运行 这个:
Number.MAX_VALUE + 1
你得到了一个很大的数字,但不是 Infinity
。那里发生了什么事?嗯,凭直觉让我们试试这个:
Number.MAX_VALUE + 1 === Number.MAX_VALUE
结果是true
。说什么?问题是浮点数的精度有限,当我将 1 添加到 Number.MAX_VALUE
时,没有足够的精度来注册增量。
如果你试试这个:
Number.MAX_VALUE * 2
然后你得到 Infinity
.
What are all the scenarios in JavaScript, where the value Infinity could be assigned to a variable in runtime?
“所有场景”...嗯...生成所有场景的枚举存在多个问题。一方面,尚不清楚应以何种标准将一种情况与另一种情况区分开来。 -Math.log(0)
与 1 / 0
是不同的场景吗?如果是这样,为什么?然后是 JavaScript 引擎有相当多的回旋余地来实现数学函数的问题。例如,Math.tan
在 current draft 中这样指定:
Math.tan(x)
Returns an implementation-dependent approximation to the tangent of
x
. The argument is expressed in radians.If
x
isNaN
, the result isNaN
.If
x
is+0
, the result is+0
.If
x
is-0
, the result is-0
.If
x
is+∞
or-∞
, the result isNaN
.
它不强制要求 Math.tan(Math.PI / 2)
的值如果您还记得三角函数 类,pi / 2
是 90 度,在该角度切线是无限大。 v8 的各种版本都返回了 Infinity
或一个非常大的正数。 (参见 this question。)规范并不强制要求一个结果优于另一个结果:实现可以自由选择。
所以实际上,如果你从一组你知道数学上应该产生 Infinity
的案例开始,你不知道它们是否 会 实际产生,直到你试试看。
关于 incrementNumToInfinity
函数的问题部分我不是很清楚。您似乎在问是否可以通过增加一个数字来达到无穷大。这取决于你的意思。如果你是这个意思:
let x = 0;
while (x !== Infinity) {
x++;
}
这将永远不会终止。 x
永远不会超过 Number.MAX_SAFE_INTEGER + 1
。所以它不会达到 Infinity
。试试这个:
let x = Number.MAX_SAFE_INTEGER + 1;
x === x + 1;
您将得到结果 true
。这又是 运行 精度问题。 1 的增量不足以在您可用的精度范围内产生差异。
将增量更改为 2、5、10 或 10000000 并不能真正解决问题,它只是改变了在增量不再产生任何影响之前可以走多远。
一个平方的平方根乘以同一个平方的 PI 的比率减去 PI 以解释接近无穷大时的无限衰减,等于无穷大。或者同时证明阿基米德的错误和正确。 PI 和平方是等价的,因为它们永远都不会达到 0。这种现象也解释了毕达哥拉斯理论中的零边界,其中 A 平方 + B 平方 = c 平方接近无穷大。
Math.sqrt(1) / (Math.PI * ((Math.sqrt(1))) - Math.PI)
这是狐狸和鸭子之谜的结果。当鸭子移动到池塘距离的 1r 时,狐狸移动 180 度或其对角和相邻角的平方和,我们得到平方 2^2(距池塘中心的行进距离)平方根PI 与给定的 1:4 比率因此三角形在 pi - pi = Infinity 上的低张力或在任何特定点与相反矢量的 1:1 关系。