0

我正在阅读Eloquent JavaScript,我在这个解释中被“卡住”了,起初我以为我会跳过它,但后来我试图回到它,我无法理解它,我尝试谷歌搜索 64 位反响和类似的东西,但我找不到答案。

我只是没有得到一些东西,例如,10^3?为什么它限制为三位小数?我试着打字1.99999999999,它成功了,有什么地方我可以完全理解这句话而不跳过它?我在某处读到 javascript 存在近似问题,2.000000000可能2.000000000001会导致问题,但这本书的这一部分似乎与我没有任何相似之处。

任何帮助表示感谢。

这是我从这本书中无法理解的部分

This is what 144 looks like in bits:

0100000001100010000000000000000000000000000000000000000000000000

The number above has 64 bits. Numbers in JavaScript always do. This has one important repercussion: There is a limited amount of different numbers that can be expressed. With three decimal digits, only the numbers 0 to 999 can be written, which is 10^3 = 1000 different numbers. With 64 binary digits, 2^64 different numbers can be written. This is a lot, more than 10^19 (a one with nineteen zeroes).

Not all whole numbers below 10^19 fit in a JavaScript number though. For one, there are also negative numbers, so one of the bits has to be used to store the sign of the number. A bigger issue is that non-whole numbers must also be represented. To do this, 11 bits are used to store the position of the fractional dot within the number.

That leaves 52 bits. Any whole number less than 2^52 (which is more than 10^15) will safely fit in a JavaScript number. In most cases, the numbers we are using stay well below that, so we do not have to concern ourselves with bits at all. Which is good. I have nothing in particular against bits, but you do need a terrible lot of them to get anything done. When at all possible, it is more pleasant to deal with bigger things.
4

2 回答 2

0

这非常简单。打开你的控制台并输入:

0.1+0.2

这将0.30000000000000004根据 JS。这就是它的近似问题。那是因为 JS 对浮点数使用IEEE 754规范。
更多关于这个话题在这里

10^3Math.pow(10,3)在 JS 中,即10*10*10or +('10' + '0' + '0'),即 1000。因此,三位小数(10 个可能的数字字符 (0-9))允许 10*10*10 组合,范围从 000 到 999 ===> 1000 种组合。
JavaScript 不限制您使用三个十进制数字,它有 64 位数字,并使用 11 位来定位小数点。

“浮点”这个名字是一个线索,在这里。小数点可以浮动。而不是使用固定位数来表示整数,然后使用固定位数来指定非整数部分:

//pseudo: assume 16 bits
00000011 00000000

这将表示 3,如果小数点是固定的(位的中间是点)。这并不理想,所以点的位置可以在 JS中浮动:

//50 zeroes
...11 00000000000

最后 11 位保持点的位置,在这种情况下3是一个整数,所以没有小数点。

当您编写2.999999时,数字本身表示为整数(位为 1 或 0,没有中间值)

1011011100011010111111

然后,最后 11 位将是:

00000010100

这会将浮点数移动到第 20 位:

10[.]11011100011010111111

这使得整数:10,或 2,后跟点,依此类推。

所以?有什么问题?

简单:虽然 JS 使用 64 位作为数字,但其中 1 位用于负数/正数,11 位用于点的位置,剩下 52 位用于数字本身,或者2^520 和 1 的可能组合(~10 ^15 种组合)

就其本身而言,这听起来很多,但重点是浮动的。整数确实可以很大,但是对于您添加的每个十进制数字,您会带走一点,它会吞噬您的数字的可能最大值。

因为丢失万亿分之一的东西通常比丢失万亿的危害更小,所以数字越大,浮点数被推回,有效数字(精度)丢失,以适应更大的数字,但前提是需要

于 2013-07-18T09:59:54.283 回答
0

Repercussion 只是英文句子的一部分,它不是一个技术术语:'this has one important repercussion' 只是意味着他要指出他一直在谈论的重要影响,在这种情况下,javascript 只能表达有限数量,我们可以计算出这个数量。

10 的 3 次方(即 10 的三次方)是 1000,这只是基本数学。他以此为例,来解释一下三个数字可以写多少个数字(可以写1000,即从0到999的所有数字)。同样,如果您有四位数字,您可以写十的四次方(10,000,即从 0 到 9999 的所有数字)。这是十的幂,因为我们使用十进制数字系统,根据定义,它基于十的幂(查找数字/基本系统,如果您仍然不确定:十进制,二进制,十六进制和八进制是那些最常用于计算)。

然后他继续谈论二进制数,javascript(以及几乎所有编程语言)中的数字系统使用:而不是 10 的幂,二进制是 2 的幂,因为二进制是以 2 为底的,而十进制是以 10 为底的。所以,再次,当你想找到你可以表达的数字的数量时,你可以计算出你所拥有的位数的幂的底数,所以因为 javascript 可以存储 64 个二进制('base 2 ') 数字,我们需要计算 2 的 64 次方,这恰好是一个非常大的数字——在你的计算器或谷歌上试试(在搜索框中输入 2^64)!

然而,正如他所说,实际上并非所有这些都可用,因为十进制和负数的存储方式。如果您对更详细的信息感兴趣,我建议您阅读 Charles Petzold 所著的Code: The Hidden Language of Computer Hardware and Software的书,因为他为新手提供了扎实而简单的解释。从好的方面来说,你很少需要知道 javascript 数字系统的内部细节才能写出好的 javascript!但是所有的知识都是好的。

于 2013-07-18T10:07:59.390 回答