给定 64 位浮点类型 (ieee-754) 和闭范围 [R0,R1] 假设 R0 和 R1 都在可表示范围内并且不是 NaN 或 +/-inf 等.
如何计算范围内可表示值的数量,这比简单地循环范围更好?
std::uint64_t count = 0;
while (r0 <= r1)
{
count++;
r0 = std::nextafterf(r0,std::numeric_limits<double>infinity());
}
二进制浮点格式(例如 IEEE-754)可以被认为是由许多 binades 组成。 Binade 是一组完整的有效数字值,所有数字都具有相同的二次方指数。 因此,半开区间 [1.0, 2.0) 是一个二元,[2.0, 4.0) 也是如此,[4.0, 8.0) 也是如此。
对于双精度,每个二进制数由 252 有效数字值组成。
因此,要计算 R0 和 R1 之间的值的数量,您可以分三部分进行:
和 x 之间的值的数量为 (x - R0) / res1,其中 res1 是包含 R0 的二进制组中的分辨率,它是 epsilon 乘以前一个幂小于 R0 的两个。 R1
和y 之间的值的数量为 (R1 - y) / res2,其中 res2 是包含 R1 的二进制文件中的分辨率,即 epsilon 乘以 y . 然后第 3 部分是二进制数的 252
倍,并且二进制数比R0 和 R1 之间的 2 的精确幂数少 1。 例如,如果R0
是12.34,R1是345.678,那么R0和R1之间的2的幂分别是16、32、64、128和256。有5个,所以有4 个完整的组合。 x 为 16,y 为 256。 我提到的“epsilon”是浮点格式的一个属性,并且(根据定义)是二进制数的分辨率[1.0, 2.0)。 对于双精度 epsilon 是 2.22045e-16。
显然仍有相当多的细节需要正确处理,以及一些年龄情况 - 特别是,R0
和R1 之间存在 2 的 1 次方或 0 次方的情况。 但这应该可以帮助您开始。