对于16bit浮点纹理格式,如SurfaceFormat.Rgba64,浮点后的范围是多少?

时间:2012-07-16 11:45:03

标签: math floating-point

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

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

16BIT_MULTIPLIER = 1000
16BIT_INVMULTIPLIER = 1 / 16BIT_MULTIPLIER

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

1 个答案:

答案 0 :(得分: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位浮点中)。