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

Math 对于16位浮点纹理格式,如SurfaceFormat.Rgba64,浮点后的范围是多少?,math,floating-point,Math,Floating Point,使用SurfaceFormat.Rgba64在HLSL中渲染时,我的范围仅为[0,1]。为了解决这个问题,我希望在浮点之后使用整个数字范围(不确定术语是否正确) 我可以使用两个常量将数字向左(16位乘法器)和向右(16位乘法器)移动 我可以将数字向右移动并保持正确精度的最大值是多少?换句话说,16位乘法器的最大值是多少?在标准32位IEEE 754浮点值中,数字中最高有效位与其最低有效位之间的最大比率是223。这是因为浮点编码的有效位(或分数)有24位(包括“隐式位”)。例如,最高比特可以是22

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

我可以使用两个常量将数字向左(16位乘法器)和向右(16位乘法器)移动


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

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

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

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

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


您询问16BIT_乘法器的最大值是多少,但这不太可能是您真正想要的。您可以将16BIT_乘法器设置为任意大,直到数字的低位达到2-149。此时,您达到指数范围的末尾(高位为2-126),无法表示值较小的位(32位浮点)。

非常好的答案,谢谢。请详细说明以下内容好吗?此缩放将把您的所有数字映射到目标范围内,精度为“以下”数字,但它不会为添加数字或其他增加幅度的操作留下任何余地。如果要在将结果保持在区间[0,1]的同时为更多算术留出空间,则需要更大的比率(更小的比例因子)。如果在[0,65536]中映射数字通过乘以1/65536,例如57344和49152等数字将映射到.875和.75。如果这是要传递给需要[0,1]中数字的渲染器的最终结果,那么很好。但是如果你要做更多的算术,比如把这些数字相加,你会得到超出区间的结果,比如1.625。在这种情况下,如果你想让最终结果保持在区间内,你必须根据你将要执行的计算来计划。如果你不打算做更多的算术,那么使用这个比例。数字s将具有24位精度。
16BIT_MULTIPLIER = 1000
16BIT_INVMULTIPLIER = 1 / 16BIT_MULTIPLIER