对于有效的随机数生成器(用于唯一的浮点值),我想了解更多有关浮点值的信息。我将把问题分成两部分。

  • 我如何找出最小和最大(包括两者)之间有多少个浮点数?

  • 我正在寻找该方法的实现:
    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/

    10-15 05:46