Tho*_*mas 7 c++ floating-point 64-bit
我正在编写一个基于无符号整数的图像类.我正在使用uint8_t和uint16_t缓冲区当前用于8位和16位RGBA像素,并且从16位转换为8位我只需要取16位值,除以std :: numeric_limits <uint16_t> :: max()转换为double,然后乘以255.
但是,如果我想为每个RGBA组件创建一个64位无符号整数的图像(我知道,这是非常高的),我将如何找到0和1之间的浮点数/双精度,表示0到0之间的距离max uint64_t我的像素值是?我假设转换为双精度不会起作用,因为双精度数通常是64位浮点数,并且您无法捕获64位浮点数中的所有64位无符号整数值.在不转换为浮点数/双打的情况下进行划分只会给我0或有时1.
找到介于0和1之间的浮点值的最准确方法是什么,它表示0和无符号64位值的最大可能值之间的距离是多少?
查找 0 和 1 之间的浮点值的最准确方法是什么,该值表示 0 和无符号 64 位值的最大可能值之间的距离?
将 [0...2 64 )范围内的整数值映射到 [0 ... 1.0) 可以直接完成。
从 转换uint64_t为double。
缩放 2 64 @Mark Ransom
#define TWO63 0x8000000000000000u
#define TWO64f (TWO63*2.0)
double map(uint64_t u) {
double y = (double) u;
return y/Two64f;
}
Run Code Online (Sandbox Code Playgroud)
遗嘱地图
[2 63 ...2 64 ) 到 [0.5 ... 1.0)范围内的整数值:2 52 个不同的double值。
[2 62 ...2 63 ) 到 [0.25 ... 0.5)范围内的整数值:2 52 个不同的double值。
[2 61 ...2 62 ) 到 [0.125 ... 0.25)范围内的整数值:2 52 个不同的double值。
...
[2 52 ...2 53 ) 到 [2 -12 ... 2 -11 )范围内的整数值:2 52 个不同的double值。
[0...2 52范围内的整数值) 到 [2 -13 ... 2 -12 ): 2 52 个不同的double值。
将 [0...2 64 )范围内的整数值映射到 [0 ... 1.0] 更加困难。(注意]vs. ).
[2021 年 2 月] 我看到这个答案需要在上边缘情况下重新解释。返回的潜在值包括 1.0。
您可以从以下 Java 的java.util.Random 方法的代码开始nextDouble()。它需要 53 位并由它们形成一个双精度数:
return (((long)next(26) << 27) + next(27))
/ (double)(1L << 53);
Run Code Online (Sandbox Code Playgroud)
我将使用 long 的最高有效 26 位作为移位值,并使用接下来的 27 位来填充低位。这会丢弃输入的最低有效位 64-53 = 11 位。
如果区分非常小的值特别重要,您还可以使用nextDouble()不返回的次正规数。