0

当使用 SurfaceFormat.Rgba64 在 HLSL 中渲染时,我只有 [0, 1] 的范围。为了解决这个问题,我希望在浮点数之后使用整个数字范围(不确定术语是否正确?)。

我可以通过使用两个常量将数字向左(16BIT_MULTIPLIER)和向右(16BIT_INVMULTIPLIER)移动来做到这一点

16BIT_MULTIPLIER = 1000
16BIT_INVMULTIPLIER = 1 / 16BIT_MULTIPLIER

我可以将数字向右移动并保持正确精度的最大量是多少?换句话说,16BIT_MULTIPLIER 的最大值是多少?

4

1 回答 1

1

在标准的 32 位 IEEE 754 浮点值中,数字中最高有效位与其最低有效位之间的最大比率为 2 23。这是因为浮点编码有 24 位(包括一个“隐式位”)作为有效位(或小数)。例如,最高位可能是 2 23而最低位是 2 0 (1),或者最高位可能是 2 12而最低位是 2 -11。在您的情况下,您可能希望使用最高位 2 -1和最低位 2 -24。您告诉我们您要映射到的范围 ([0, 1]) 但不是您要映射的范围,因此我们无法告诉您要使用的比例因子。

如果您从无符号 16 位数字映射,范围为 [0, 65536),则可以使用 1/65536 的比例因子。(在许多语言中,您会编写1./65536以获得浮点常量;1/65536将是一个计算结果为零的整数表达式。)这种缩放会将您的所有数字映射到目标范围,其可用精度“低于”数字,但它会不要为添加数字或其他增加幅度的操作留下任何余量。如果您想在将结果保持在区间 [0, 1] 的同时为更多算术留出空间,那么您需要更大的比率(更小的比例因子)。

您应该使用 2 的幂作为比例因子。乘以 2 的幂在二进制浮点中没有舍入误差。乘以十次方或其倒数(这必然是近似的,因为十次方的倒数不能用二进制浮点数精确表示)通常会导致舍入误差。

在标准的 64 位 IEEE 浮点值中,最大比率为 2 52

你问最大值 16BIT_MULTIPLIER 可以是多少,但这不太可能是你真正想要的。您可以使 16BIT_MULTIPLIER 尽可能大,直到数字的低位达到 2 -149。此时,您到达指数范围的末尾(高位为 2 -126),并且无法表示具有较小值的位(在 32 位浮点中)。

于 2012-07-16T12:18:09.863 回答