我正在写一个基于无符号整数的图像类。我目前对8位和16位RGBA像素使用uint8_t和uint16_t缓冲,要从16位转换到8位,我只需将16位值除以std::numeric_limits
但是,如果我想要一个图像,每个RGBA分量都是64位无符号整数(我知道,这个数字高得离谱),我该如何在0和1之间找到一个浮点/双精度数,来表示我的像素值在0和最大uint64_t之间有多远呢?我认为转换为double是行不通的,因为double通常是64位浮点型,并且您不能在64位浮点型中捕获所有64位无符号整数值。没有转换成浮点数/双精度数的除法只能得到0或者有时是1。
查找0和1之间的浮点值的最准确方法是什么,该浮点值表示0和无符号64位值的最大值之间的距离?
OP要求C,所以这里是:(假设编译器知道类型__int64
这可能是Visual Studio主义。
double asDouble(unsigned __int64 v)
{
return ((__int64)(v >> 11)) / (double)(1L << 53);
}
或者,如果你不介意时髦的演员:
double asDouble(unsigned __int64 v)
{
// the 0x3FF sets the exponent to the 0..1 range.
unsigned __int64 vv == (v >> 11) | (0x3FFL << 53);
return *(double*)&vv;
}
您可以从以下代码开始Java的java.util.随机<代码>next双精度()方法。它需要53位并从中形成一个双精度:
return (((long)next(26) << 27) + next(27))
/ (double)(1L << 53);
我会使用长整型中最重要的 26 位作为移位值,接下来的 27 位来填充低阶位。这将丢弃最不重要的 64-53 = 11 位输入。
如果区分非常小的值特别重要,您也可以使用次正规数,这是< code>nextDouble()不会返回的。
查找0和1之间的浮点值的最准确方法是什么,该浮点值表示0和无符号64位值的最大值之间的距离?
可以直接将[0…264)到[0…1.0)范围内的整数值映射。
>
从 uint64_t
转换为双倍
。
按264 @Mark Ransom缩放
#define TWO63 0x8000000000000000u
#define TWO64f (TWO63*2.0)
double map(uint64_t u) {
double y = (double) u;
return y/Two64f;
}
遗嘱地图
范围内的整数值 [263...264) 至 [0.5 ...1.0):252 种不同的双精度
值。范围内的
整数值 [262...263) 至 [0.25 ...0.5):252 种不同的双精度
值。范围内的
整数值 [261...262) 至 [0.125 ...0.25):252 个不同的双精度
值。
。
范围内的整数值 [252...253) 至 [2-12 ...2-11):252 种不同的双精度
值。
介于 [0...252) 到 [2-13 ...2-12):252 种不同的双精度
值。
要映射范围[0...264)到[0...1.0]比较难。(注意< code>]与< code>)。
[2021年2月]我认为这个答案需要重新解释上边缘情况。返回的潜在值包括1.0。
我想用一个小数点和一个小数位的格式将任何双精度四舍五入为双精度,这样29575.347434将是2.3。 我试着用decimalFormat做这个,但当我试着我只得到了一个29575.3格式的字符串,带有一个,我不知道如何在保留值为双精度的同时去掉所有小数点。
问题内容: 我试图确定双精度的最大精度是多少。在此链接的可接受答案的注释中,Java中的double保持精度 @PeterLawrey将max precision设置为15。 您如何确定呢? 问题答案: @PeterLawrey表示最大精度为15。 实际上,这根本不是他所说的。他说的是: 双精度有15个小数位 他错了。它们的精度为15个十进制 数字 。 任何数字中的小数位数由其对数10的对数给出。
我试图确定double的最大精度是多少。在这个链接中接受的答案的注释中,Java中的Retain precision with double@PeterLawrey声明max precision In 15。 你如何确定这一点?
问题内容: 我有一个浮点数组,我想将其转换为Java中的双精度数组。我知道迭代数组并创建一个新数组的明显方法。我希望Java在希望与double []一起工作的地方能够平稳地消化float [] …,但不能与此一起工作。进行这种转换的优雅,有效的方法是什么? 问题答案: 基本上 , 必须进行每个值的转换。两种数组类型之间没有隐式转换,因为在JITting之后用于处理它们的代码将有所不同- 它们具有
问题内容: 我有这个问题,我必须将公里转换成英里。我是一个新手程序员,所以请耐心等待。 到目前为止,这是我的代码: 它给我一个错误,说: 问题答案: 您正在尝试将a 设置为变量 要修复,请更改此行 至
在我的计算机科学课程中,我们正在研究浮点数以及它们在内存中是如何表示的。我已经理解了它们在内存中是如何表示的(尾数/有效数、指数及其偏差、符号位),我也理解了浮点是如何相互添加和减去的(反规格化和所有那些有趣的东西)。然而,在翻阅一些学习问题时,我注意到一些我无法解释的东西。 当一个不能精确表示的浮点数加到自己身上几次时,答案比我们在数学上预期的要低,但当同一个浮点数乘以一个整数时,答案就精确地得