Ste*_* Lu 3 javascript integer overflow
我只是想在JS中实现一个简单的RNG.
发生了什么事是JavaScript的评估119106029 * 1103515245是131435318772912110不是131435318772912105.我们知道这是错误的,因为两个奇数相乘不会给出偶数.
谁知道怎么了?我只想要一个可靠的可重复RNG,并且由于这些不正确的值,我无法得到与我同样的C实现相匹配的结果.
Jas*_*rff 18
根据ECMAScript标准,JavaScript中的所有数字都是(64位IEEE 754)浮点数.
但是,所有32位整数都可以精确表示为浮点数.您可以使用适当的按位运算符将结果强制为32位,如下所示:
x = (a * b) >>> 0; // force to unsigned int32
x = (a * b) | 0; // force to signed int32
Run Code Online (Sandbox Code Playgroud)
很奇怪,但这是标准.
(顺便提一下,这种舍入行为是针对Firefox的JavaScript引擎最常报告的"错误"之一.看起来今年迄今已报道过3次......)
至于JavaScript中可重现的随机数,V8基准测试使用:
// To make the benchmark results predictable, we replace Math.random
// with a 100% deterministic alternative.
Math.random = (function() {
var seed = 49734321;
return function() {
// Robert Jenkins' 32 bit integer hash function.
seed = ((seed + 0x7ed55d16) + (seed << 12)) & 0xffffffff;
seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff;
seed = ((seed + 0x165667b1) + (seed << 5)) & 0xffffffff;
seed = ((seed + 0xd3a2646c) ^ (seed << 9)) & 0xffffffff;
seed = ((seed + 0xfd7046c5) + (seed << 3)) & 0xffffffff;
seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff;
return (seed & 0xfffffff) / 0x10000000;
};
})();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4243 次 |
| 最近记录: |