以两个字节存储已知范围内的正浮点数
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
来做同样的事情
我知道数字 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