JavaScript:高效的整数运算

时间:2011-04-18 20:38:37

标签: javascript math integer

我目前正在为编译为JavaScript的小语言编写编译器。在这种语言中,我非常喜欢使用整数,但JavaScript只支持Number,这是一个双精度浮点值。那么,在JavaScript中实现整数的最有效方法是什么?与仅使用数字相比,这有多高效?

特别是,溢出行为应与其他语言保持一致:例如,向INT_MAX添加一个应该给出INT_MIN。整数应该是32位或64位。

7 个答案:

答案 0 :(得分:8)

  

那么,在JavaScript中实现整数的最有效方法是什么?

原始数字类型与它获得的效率一样高。许多现代JS引擎都支持JIT编译,因此它应该与本机浮点算法一样高效。

  

特别是,溢出行为应与其他语言保持一致:例如,向INT_MAX添加一个应该给出INT_MIN。整数应该是32位或64位。

通过注意JavaScript将“数字”转换为32位整数以进行按位运算,可以实现标准32位整数运算的语义。 >>>(无符号右移)将其操作数转换为无符号32位整数,而其余(所有其他移位和按位AND / OR)将其操作数转换为带符号的32位整数。例如:

  • 0xFFFFFFFF | 0收益-1(签名演员)
  • (0xFFFFFFFF + 1) | 0收益0(溢出)
  • -1 >>> 0收益0xFFFFFFFF(无符号演员)

答案 1 :(得分:3)

我在Javascript中发现了BigIntegers的这种实现:http://www-cs-students.stanford.edu/~tjw/jsbn/

也许这会有所帮助?

编辑:此外,Google Closure库实现了64位整数: http://code.google.com/p/closure-library/source/browse/trunk/closure/goog/math/long.js

这些基本上只是生成便利对象,并且不会做任何改善基本数据类型效率的事情。

答案 2 :(得分:1)

所有数字都是数字。没有办法解决这个问题。 JavaScript没有byte或int类型。要么处理限制,要么使用更低级别的语言来编写编译器。

如果你想实现这个目的,唯一合理的选择是编辑一个JavaScript解释器(比如V8)并扩展JS以允许访问本机C字节。

答案 3 :(得分:1)

在现代CPU上,如果将整数值限制在+ - 2 ^ 52范围内,则使用double的效率几乎不会低于使用long

double IEE754类型有53位尾数,因此您可以轻松地表示32位整数范围,然后是一些。

无论如何,Javascript的其余部分将比用于处理算术的各个CPU指令更加瓶颈。

答案 4 :(得分:0)

那么你可以选择JavaScript的数字类型,这可能是使用CPU的原语计算出来的,或者你可以选择对一组完整的运算符和函数进行分层,而不是在模拟的一系列位上...?< / p>

......如果你的关注表现和效率,请坚持使用双打。

答案 5 :(得分:0)

最有效的方法是使用数字,并添加操作以确保模拟整数上的操作可以给出整数结果。例如,除法必须向下舍入,并且必须检查乘法是否溢出或掩盖以适应整数范围。

这当然意味着您的语言中的浮点运算将比整数运算快得多,从而首先破坏了具有整数类型的大部分目的。

答案 6 :(得分:0)

  

请注意,ECMA-262 Edition 3已添加   Number.prototype.toFixed,需要   一个精确的参数告诉了多少   小数点后的数字   节目。和你一起使用这种方法   不介意之间的差距   有限精度基数2和   “任意”或“适当”的精确度   我们每天使用的基础10。    - Brendan Eich