使用浮点类型时,一个范围内可以表示多少个值

问题描述 投票:0回答:1

给定 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());
}
floating-point ieee-754
1个回答
0
投票

二进制浮点格式(例如 IEEE-754)可以被认为是由许多 binades 组成。 Binade 是一组完整的有效数字值,所有数字都具有相同的二次方指数。 因此,半开区间 [1.0, 2.0) 是一个二元,[2.0, 4.0) 也是如此,[4.0, 8.0) 也是如此。

对于双精度,每个二进制数由 252 有效数字值组成。

因此,要计算 R0R1 之间的值的数量,您可以分三部分进行:

  1. R0与大于R0的下一个二的幂之间的值的数量(称为下一个二的幂值x
  2. R1 和前一个小于 R1 的 2 的幂之间的值的数量(将此前一个 2 的幂值称为 y
  3. xy 之间完整二进制值的数量
R0

x 之间的值的数量为 (x - R0) / res1,其中 res1 是包含 R0 的二进制组中的分辨率,它是 epsilon 乘以前一个幂小于 R0 的两个。 R1

y 之间的值的数量为 (R1 - y) / res2,其中 res2 是包含 R1 的二进制文件中的分辨率,即 epsilon 乘以 y . 然后第 3 部分是二进制数的 252

倍,并且二进制数比

R0R1 之间的 2 的精确幂数少 1。 例如,如果R0

是12.34,

R1是345.678,那么R0R1之间的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 次方的情况。 但这应该可以帮助您开始。

© www.soinside.com 2019 - 2024. All rights reserved.