16位图像整数归一化至0-1浮点数:float16能否满足还原精度?
16位图像归一化后还原的精度问题
- 结论先行:如果需要精确还原回0-65535的所有原始整数,必须使用float32;float16的精度不足以保证无误差还原。
具体原因:
float16的精度限制
半精度浮点数(float16)只有10位尾数位(加上隐含的1位共11位有效二进制位),对应十进制约3-4位有效数字。在0.5到1的区间内,float16可表示的数值间隔是1/2048 ≈ 0.000488,而原始16位整数归一化后的步长是1/65535 ≈ 0.00001526——这个步长远小于float16的间隔。
举个实际例子:原始值32769归一化后是32769/65535 ≈ 0.50001526,但float16无法区分这个值和0.5(对应原始值32768),会将其近似为0.5,还原后得到32768,丢失了原始数据的精度。float32的精度足够
单精度浮点数(float32)有23位尾数位(加隐含位共24位有效二进制位),对应十进制约7-8位有效数字。在0-1区间内,float32的最小间隔是1/16777216 ≈ 5.96e-8,远小于归一化后的步长1/65535,可以精确存储每一个归一化后的数值,还原时能准确得到原始的0-65535整数。
总结
如果你的场景允许少量精度损失(比如某些视觉任务对细微灰度变化不敏感),float16可能勉强能用;但如果要求精确还原所有原始像素值,必须选择float32。
内容的提问来源于stack exchange,提问作者StE
相关产品推荐
相关产品推荐

