JavaScript:对数字的64位影响

时间:2013-07-18 09:49:18

标签: javascript numbers 64-bit

我正在阅读 Eloquent JavaScript ,我在这个解释中“陷入困境”,起初我以为我会跳过它,但后来我试图回到它,我不能理解它,我尝试谷歌搜索64位反应和类似的东西,但我没有找到答案。

我只是没有得到一些东西,例如,10^3?为什么它限制为三位小数?我尝试输入1.99999999999并且它有效,是否有任何地方我可以完全理解这句话而不跳过它?我在某处看到javascript有近似问题,例如2.000000000可能2.000000000001可能导致问题,但本书的这一部分似乎与我的相似。

任何帮助表示感谢。

这是this book

中我不理解的部分
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.

2 个答案:

答案 0 :(得分:0)

这很简单。打开控制台并输入:

0.1+0.2

根据JS,这将是0.30000000000000004。这是近似的问题。那是因为JS使用the IEEE 754规范来浮动 有关该主题的更多信息here

10 ^ 3在JS中是Math.pow(10,3),即10*10*10+('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^52可能0和1的组合(~10 ^ 15组合)

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

因为松散万亿分之一的东西通常比松掉万亿分之一的东西要小一些,所以数字越大,浮点就会被推回,有效数字(精度)会丢失,以容纳更大的数字但仅在需要时

答案 1 :(得分:0)

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

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

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

然而,正如他所说,实际上并非所有这些都可用,因为存储了十进制和负数。如果您对更多细节感兴趣,我建议您阅读Charles Petzold撰​​写的书籍代码:计算机硬件和软件的隐藏语言,因为他为新人提供了可靠而简单的解释。这个。从好的方面来说,你很少需要知道javascript编号系统的内部细节才能写出好的javascript!但是所有的知识都很好。