gpt4 book ai didi

JavaScript整数数学不正确的结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:35:24 24 4
gpt4 key购买 nike

我只是想在 JS 中实现一个简单的 RNG。

发生的事情是 javascript 将 119106029 * 1103515245 计算为 131435318772912110 而不是 131435318772912105。我们知道这是错误的,因为两个奇数相乘不会得到偶数。

有人知道怎么回事吗?我只想要一个可靠的可重复 RNG,并且由于这些不正确的值,我无法获得与我对同一事物的 C 实现相匹配的结果。

最佳答案

根据 ECMAScript 标准,默认情况下,JavaScript 中的所有数字都是(64 位 IEEE 754) float 。

然而,所有 32 位整数都可以精确地表示为 float 。您可以使用适当的按位运算符将结果强制为 32 位,如下所示:

x = (a * b) >>> 0;  // force to unsigned int32
x = (a * b) | 0; // force to signed int32

很奇怪,但这是标准。

(顺便说一句,这种舍入行为是针对 Firefox 的 JavaScript 引擎的 one of the most frequently reported "bugs"。看起来今年到目前为止已经报告了 3 次...)

如果你想要真正的整数数学,你可以使用 BigInt 值,一种不同类型的数字,在末尾写一个 n:

> 119106029n * 1103515245n
131435318772912105n

这是一个相对较新的 JS 特性,可能不会在旧浏览器中实现。


对于 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;
};
})();

关于JavaScript整数数学不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58565600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com