我正在编写一个基于无符号整数的图像类。目前,我使用uint8_t和uint16_t缓冲区来处理8位和16位RGBA像素,并且为了将16位转换为8位,我只需取16位值,除以std::numeric_limits :: max()转换为双精度,然后乘以255。
但是,如果我想要每个RGBA组件都具有64位无符号整数的图像(我知道,这太高了),那么我该如何找到一个介于0和1之间的浮点数/双精度数,表示我的像素值在0和最大uint64_t之间的距离?我假设转换为双精度不起作用,因为双精度通常是64位浮点数,而且在64位浮点数中无法捕获所有64位无符号整数值。不进行浮点数/双精度数转换就进行除法运算只会给我0或者有时候是1。
最准确的方法是什么,可以找到介于0和1之间的浮点数,表示无符号64位值的最大可能值之间的距离?
但是,如果我想要每个RGBA组件都具有64位无符号整数的图像(我知道,这太高了),那么我该如何找到一个介于0和1之间的浮点数/双精度数,表示我的像素值在0和最大uint64_t之间的距离?我假设转换为双精度不起作用,因为双精度通常是64位浮点数,而且在64位浮点数中无法捕获所有64位无符号整数值。不进行浮点数/双精度数转换就进行除法运算只会给我0或者有时候是1。
最准确的方法是什么,可以找到介于0和1之间的浮点数,表示无符号64位值的最大可能值之间的距离?
uint64_t
到double
的转换会丢失一些位,但这将是你能够接受的最少的位数 - 而且这些位数在某个时候无论如何都会丢失。结果仍然比99.9%的使用情况所需的精确度要高得多。 - Mark Ransom