是否有一些技巧可以让您相对快速地计算或至少估计两个给定数字之间包含的浮点数的数量?在 C++ 中,可以这样完成:
#include <cmath>
#include <iostream>
using namespace std;
int main()
{
double a= 1, b= 1.00000001; // a - первое число, b - второе число
long long count = 0;
for (double x = a; x < b; x = nextafter(x, numeric_limits<double>::max()))
{
count++;
}
cout << count << endl;
return 0;
}
但是太慢了。不需要计算确切的金额,-50 + 200% 的误差是完全可以接受的
我可以建议一个“肮脏的把戏”:)
每个可能的 64 位位模式编码一些 IEEE 754 binary64 浮点值。另一方面,相同的模式编码一些类型的整数
std::uin64_t。如果您从零开始以无符号整数的升序遍历所有位模式,则相应的浮点数也会增加。顺序为:正零,正非归一化值从小到大,正归一化值从小到大,正无穷大,“正”NaNs。
然后跳转到负值。最后一个“正”NaN后面是负值:负零、负非归一化值从大到小、负归一化值从大到小、负无穷大、“负”NaN。
我们可以说所有浮点数自然地从正零开始编号。如果我们知道数字 number
a和 number number ,那么计算数字和b之间的数字的个数就不难了,即 数字和之间的浮点数。abab上面的代码假设类型的字节顺序
std::uint32_t是double一致的:低字节对应低字节,高字节对应高字节。当然,这取决于特定的平台。