我目前正在为编译为JavaScript的小型语言编写一个编译器。在这种语言中,我非常想要整数,但JavaScript只支持Number,它是一个双精度浮点值。那么,在JavaScript中实现整数的最有效方法是什么?与仅使用Number相比,这种效率有多高?JavaScript:高效的整数算术
特别是,溢出行为应该与其他语言一致:例如,向INT_MAX加1应该给INT_MIN。整数应该是32位或64位。
我目前正在为编译为JavaScript的小型语言编写一个编译器。在这种语言中,我非常想要整数,但JavaScript只支持Number,它是一个双精度浮点值。那么,在JavaScript中实现整数的最有效方法是什么?与仅使用Number相比,这种效率有多高?JavaScript:高效的整数算术
特别是,溢出行为应该与其他语言一致:例如,向INT_MAX加1应该给INT_MIN。整数应该是32位或64位。
我发现在Javascript此实现BigIntegers的:http://www-cs-students.stanford.edu/~tjw/jsbn/
或许这将帮助?
编辑:此外,谷歌封库实现64位整数: http://code.google.com/p/closure-library/source/browse/trunk/closure/goog/math/long.js
这些基本上只是生成对象的方便,虽然,以及改善对基本数据类型的效率不会做任何事情。
那么你可以选择JavaScript的数字类型,这可能是使用CPU的基元计算出来的,或者你可以选择分层完整的操作符和函数包以及不在模拟的一系列位上......?
...如果您的表现和效率值得关注,请坚持双打。
所有数字都是数字。这是没有办法的。 JavaScript没有字节或整型。要么处理这些限制,要么使用更低级的语言来编写你的编译器。
如果你想达到这个目的,唯一明智的选择是编辑一个JavaScript解释器(比如V8)并扩展JS以允许访问本地C字节。
在现代CPU上,如果将整数值限制在+ - 2^52范围内,那么使用double
的效率几乎不如使用long
。
double
IEE754类型有53位的尾数,所以你可以很容易地表示32位整数范围,然后一些。
在任何情况下,Javascript的其余部分都将比用于处理算术的单个CPU指令更成为一个瓶颈。
效率最高的方法是使用数字,并添加操作以确保对模拟整数的操作会给出整数结果。例如,一个分区必须向下舍入,并且要么必须检查乘法溢出,要么将其屏蔽掉以适应整数范围。
这当然意味着用你的语言进行浮点运算的速度将比整数运算快得多,这首先破坏了大多数具有整数类型的目的。
那么,在JavaScript中实现整数的最有效方法是什么?
原始数字类型与其获得的效率一样高。许多现代的JS引擎都支持JIT编译,所以它应该和原生浮点运算几乎一样高效。
特别是,溢出行为应该与其他语言一致:例如,向INT_MAX加1应该给INT_MIN。整数应该是32位或64位。
您可以通过注意JavaScript将“数字”转换为32位整数来实现按位操作,从而实现标准32位整数算术的语义。 >>>
(无符号右移)将其操作数转换为无符号的32位整数,而其余(所有其他移位和按位AND/OR)将其操作数转换为带符号的32位整数。例如:
0xFFFFFFFF | 0
收率-1
(带符号的铸造)(0xFFFFFFFF + 1) | 0
收率0
(溢出)-1 >>> 0
收率0xFFFFFFFF
(无符号铸造)注意,ECMA-262第3版添加 Number.prototype.toFixed,这需要 一个精确的数字告诉多少 小数点后的位数为 显示。很好地使用这种方法,并且您将不会介意我们每天使用的基准10的有限精度基数2和 “任意”或“适当”精度的差异。 - Brendan Eich
'X | 0'返回数字的整数分量??哇,这是很好的知道':))' – 2011-04-18 21:04:49
@ŠimeVidas:是的,这是一个快速的方法来缩小一个数字,只要它小于2^32。 – casablanca 2011-04-18 23:52:39