gpt4 book ai didi

javascript - 我如何有效地判断我存储的值是否在 TypedArray 的范围内?

转载 作者:行者123 更新时间:2023-11-30 19:11:12 26 4
gpt4 key购买 nike

在 Chrome(可能还有其他浏览器)中,当我将值存储到超出其范围的 TypedArray 时,它会被 chop :

const arr = new Uint16Array(1);
arr[0] = 100000;
console.log(arr[0]); // logs 34464

我有一个设计,我可以允许用户提供任何 TypedArray 类型,我希望能够检测到何时会发生这种溢出并抛出 RangeError 而不是允许数据被 chop :

const arr: T = getArraySomehow(); // T implements TypedArray
const val: number = getValueSomehow();
if (valOverflows(val, arr)) {
throw new RangeError('Value overflow');
}
arr[getIndexSomehow()] = val;

实现/内联 valOverflows() 的最佳方式是什么?

  • 我真的应该尝试存储该值并查看是否可以原封不动地取回它吗?这可能适用于整数数组,但不适用于 float 组(因为此处的损失可能只是精度损失),其他方法可能更快。
  • TypedArray 原型(prototype)上是否有一个 secret /实验方法来给出最小值和最大值,或者一个标志导致溢出被发出信号?
  • 我应该只使用 instanceof 检查和某种查找表吗?

最佳答案

我喜欢你的第一个想法(你试过了吗?)。

const compare = (val, type) => {
const arr = new type(1)
arr[0] = val
const same = arr[0] === val
console.log(val, arr[0], same)
return same
}

var value = 300
compare(value, Int16Array)
compare(value, Uint8Array)
compare(value, Uint16Array)
value = 2**32
compare(value, Uint32Array)
value -= 1
compare(value, Uint32Array)

这只是将值与特定数组类型上设置的值的实例进行比较。


正如您所提到的,这不适用于 float ,因为该值很可能在范围内,只是精度有问题。对于 float ,您可以使用 map 并比较硬编码的范围限制。但我想如果你这样做,你也可以使用所有类型的 map 。

const ranges = {
[Uint8Array.name]: {
min: 0,
max: 255
},
[Float32Array.name]: {
min: 1.2e-38,
max: 3.4e38
}
}

const compare = (val, type) => {
const { min, max } = ranges[type.name]
return val >= min && val <= max
}

console.log(compare(100, Float32Array))
console.log(compare(3.4e38, Float32Array))
console.log(compare(3.5e38, Float32Array))
console.log(compare(255, Uint8Array))
console.log(compare(256, Uint8Array))

范围可以在这里找到:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray

关于javascript - 我如何有效地判断我存储的值是否在 TypedArray 的范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58459693/

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