对于有效的随机数生成器(用于唯一的浮点值),我想了解更多有关浮点值的信息。我将把问题分成两部分。
我正在寻找该方法的实现:
size_t numOfFloats(const float min, const float max);
给定数据类型的最大精度,它将考虑所有可能的浮点值。
我正在寻找该方法的实现:
vector<float> enumAllFloats(const float min, const float max);
返回的 vector 的大小应始终等于第一个问题的方法的返回值。
如果需要,则允许使用C++ 11。
最佳答案
可以使用float的ieee754表示形式将它们映射到int。然后,使用整数进行数学运算。
请注意,以下代码不适用于负数,并且未考虑特殊的浮点值(NaN,无穷大...)
size_t numOfFloats(const float min, const float max){
// assert 0 <= min <= max
// assert sizeof(float) == sizeof(int32_t)
const int32_t min_i = *reinterpret_cast<const int32_t*>(&min);
const int32_t max_i = *reinterpret_cast<const int32_t*>(&max);
return max_i-min_i+1;
}
另外,当您知道带有整数的映射时,可以轻松列出它们:
void print_successive_floats(const float min, const float max){
const int32_t min_i = *reinterpret_cast<const int32_t*>(&min);
const int32_t max_i = *reinterpret_cast<const int32_t*>(&max);
for(int32_t i = min_i; i<=max_i; ++i){
float f = *reinterpret_cast<float*>(&i);
std::cout << f << std::endl;
}
}
为了完整起见,为了匹配您的API:
vector<float> enumAllFloats(const float min, const float max){
vector<float> out;
out.reserve(numOfFloats(min, max));
const int32_t min_i = *reinterpret_cast<const int32_t*>(&min);
const int32_t max_i = *reinterpret_cast<const int32_t*>(&max);
for(int32_t i = min_i; i<=max_i; ++i){
float f = *reinterpret_cast<float*>(&i);
out.push_back(f);
}
return out;
}
当心巨大的 vector =)
关于c++ - 如何枚举最小和最大之间的所有浮点值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31473728/