我目前正在为编译为JavaScript的小语言编写编译器。在这种语言中,我非常喜欢使用整数,但JavaScript只支持Number,这是一个双精度浮点值。那么,在JavaScript中实现整数的最有效方法是什么?与仅使用数字相比,这有多高效?
特别是,溢出行为应与其他语言保持一致:例如,向INT_MAX添加一个应该给出INT_MIN。整数应该是32位或64位。
答案 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