JavaScript 如何存储数值?

2023-12-24

我是 JavaScript 编程新手,参考了 Marijn Haverbeke 的 Eloquent JavaScript,第 3 版。

这本书里有一句话,大意是这样的:

“JavaScript 使用固定数量的位(其中 64 位)来存储单个数值。使用 64 位只能制作这么多模式,这意味着可以表示的不同数字的数量是有限的。用 N十进制数字,你可以表示 10^N 个数字。同样,给定 64 个二进制数字,你可以表示 2^64 个不同的数字,这大约是 18 个昆体数(18 后面有 18 个零)。这很多。”

有人可以帮助我理解这句话的实际含义吗?我很困惑超过 2^64 的值如何存储在计算机内存中。


有人可以帮助我理解这句话的实际含义吗?我是 对于如何将大于 2^64 的值存储在中感到困惑 电脑内存。

您的问题与计算机科学中更通用的概念有关。对于这个问题,Javascript 保持在较高的水平。

请先了解内存和存储的基本概念;

  • https://study.com/academy/lesson/how-do-computers-store-data-memory-function.html https://study.com/academy/lesson/how-do-computers-store-data-memory-function.html
  • https://www.britannica.com/technology/computer-memory https://www.britannica.com/technology/computer-memory
  • https://www.reddit.com/r/askscience/comments/2kuu9e/how_do_computers_handle_extremely_large_numbers/ https://www.reddit.com/r/askscience/comments/2kuu9e/how_do_computers_handle_extremely_large_numbers/
  • 计算机如何评估巨大的数字? https://stackoverflow.com/questions/18333967/how-do-computers-evaluate-huge-numbers

另外,对于 Javascript,请参阅 ECMAScript 部分

Ref: https://www.ecma-international.org/ecma-262/5.1/#sec-8.5 https://www.ecma-international.org/ecma-262/5.1/#sec-8.5

Number 类型正好有 18437736874454810627 个(即 264−253+3)个值,表示 IEEE 二进制浮点运算标准中指定的双精度 64 位格式 IEEE 754 值,除了 9007199254740990(即, 253−2) IEEE 标准的不同“非数字”值在 ECMAScript 中表示为单个特殊 NaN 值。 (请注意,NaN 值是由程序表达式 NaN 生成的。)在某些实现中,外部代码可能能够检测各种非数字值之间的差异,但这种行为取决于实现;对于 ECMAScript 代码,所有 NaN 值都无法区分。

还有另外两个特殊值,称为正无穷大和负无穷大。为了简洁起见,为了说明的目的,这些值也分别用符号+∞和-∞来指代。 (请注意,这两个无限数值由程序表达式 +Infinity(或简称 Infinity)和 -Infinity 生成。)

其他 18437736874454810624 (即 264−253)个值称为有限数。其中一半是正数,一半是负数;对于每个有限的正数值,都有一个具有相同大小的相应负值。

请注意,既有正零又有负零。为了简洁起见,出于说明目的,这些值也分别用符号+0和-0来指代。 (请注意,这两个不同的零数值是由程序表达式 +0(或简称 0)和 -0 生成的。)

18437736874454810622(即 264−253−2)个有限非零值有两种:

其中 18428729675200069632 (即 264−254)被归一化,具有以下形式

s×m×2e 其中,s为+1或-1,m为小于253但不小于252的正整数,e为-1074至971范围内的整数,包括端值。

剩余的 9007199254740990 (即 253−2)值被非规格化,具有以下形式

s×m×2e 其中s为+1或-1,m为小于252的正整数,e为-1074。

请注意,所有大小不大于 253 的正整数和负整数都可以用 Number 类型表示(实际上,整数 0 有两种表示形式:+0 和 -0)。

如果有限数非零且用于表达它的整数 m(以上面所示的两种形式之一)为奇数,则该数具有奇数有效数。否则,它的有效数为偶数。

在本说明书中,短语“x的数值”,其中x代表精确的非零实数数学量(其甚至可以是无理数,例如π),意味着以以下方式选择的数值。考虑 Number 类型的所有有限值的集合,删除了 −0 并添加了两个在 Number 类型中无法表示的附加值,即 21024(即 +1 × 253 × 2971)和 −21024(即为−1×253×2971)。选择该集合中值最接近 x 的成员。如果集合中的两个值同样接近,则选择有效数为偶数的那个;为此,两个额外值 21024 和 -21024 被认为具有偶数有效数字。最后,如果选择21024,则将其替换为+∞;如果选择了−21024,则将其替换为−∞;如果选择+0,当且仅当x小于零时,将其替换为-0;任何其他选择的值均保持不变。结果是 x 的数值。 (此过程与 IEEE 754“舍入到最近”模式的行为完全一致。)

某些 ECMAScript 运算符仅处理 -231 到 231−1(含)范围内的整数,或 0 到 232−1(含)范围内的整数。这些运算符接受 Number 类型的任何值,但首先将每个此类值转换为 232 个整数值之一。分别参见 9.5 和 9.6 中对 ToInt32 和 ToUint32 运算符的描述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 如何存储数值? 的相关文章

随机推荐