JavaScript 中的数字能否在运行时达到无穷大?

Can a number in JavaScript ever reach to Infinity in runtime?

我只是好奇,JavaScript 中的数字是否可以达到 Infinity

JavaScript数的范围已经足够了——2的64次方不同的数,大约是18昆体( 18 后面有 18 个零)。好多啊。

现在,我有几个问题:

  1. 当数字超出该范围时会发生什么? JavaScript 会把它称为新的 Infinity 号码吗?
  2. 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 / 0x 将有价值 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.tancurrent 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 关系。