问题描述
我正在尝试将一个值小于或等于 Number.MAX_SAFE_INTEGER 的数字分解为两个 32 位 uint 值。
我首先想到的就是 value >>> 32 但这首先将 value 转换为 32b uint,因此结果为 0。
另一个想法是
var high = Number(BigInt(value) >> 32n);
但是,使用 BigInt 相对较慢,如果可能,我想避免这种情况
然后我尝试了 Math.floor(value / 2 ** 32) 这比 BigInt 快得多,而且看起来很准确,但我需要保证它是准确的。如果值在 2 ** 32 和 Number.MAX_SAFE_INTEGER 之间,是否有可能不准确?这是一个浮点计算,所以我很怀疑。
还有其他快速获取 53b 整数高值的方法吗?
编辑:如果您的计算机速度非常快,则可以测试第三种方法
for (let v = 0,high = 0; high <= 2 ** 21; high++) {
for (let low = 0; low < 2 ** 32; low++) {
if (Math.trunc(v++ / 2 ** 32) != high) throw "Error at " + v;
}
}
在我的笔记本电脑上,这需要 6 年半的时间。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)