以两个字节存储已知范围内的正浮点数

Storing a positive floating point number in a known range in two bytes

我知道数字 x 位于 n 和 f 之间 (f > n > 0)。所以我的想法是通过 0.65535 * (x - n) / (f - n).

将该范围带到 [0, 0.65535]

然后我就可以乘以 10000,舍入并将整数存储在两个字节中。

它会在精度方面有效地使用存储吗?

我正在为 WebGL1.0 着色器做这件事,所以我想要简单的 encoding/decoding 数学,我无法访问按位运算。

为什么要先乘以 0.65535 再乘以 10000.0?这引入了不必要的精度损失的第二舍入。

如果数据在整个范围 (f,n) 上具有相同的可能性,则数据将得到很好的表示。但这并不总是一个合理的假设。您所做的类似于创建 fixed-point 表示(固定步长,只是不是从 0 开始或步长为 2 的负幂)。

Floating-point 数字对更大的数字使用更大的步长。你可以通过计算 log(x/f) / log(n/f) * 65535

来做同样的事情