6

次の方法で浮動小数点値を生成するとします。

template <typename T>
T RandomFromRange(T low, T high){
    std::random_device random_device;
    std::mt19937 engine{random_device()};
    std::uniform_real_distribution<T> dist(low, high);
    return dist(engine);
}

template <typename T>
T GetRandom(){
    return RandomFromRange
    (std::numeric_limits<T>::min(),std::numeric_limits<T>::max());
}

//produce floating point values:
auto num1 = GetRandom<float>();
auto num2 = GetRandom<float>();
auto num3 = GetRandom<float>();
//...

NaNInf、またはが返される可能性はあり-Infますか?

4

2 に答える 2

6

std::uniform_real_distribution実際、 (私が持っているドラフト仕様のセクション 26.5.8.2.2)の要件のため、これにより未定義の動作が発生します。

explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0);
    Requires: a ≤ b and b − a ≤ numeric_limits<RealType>::max().
    Effects: Constructs a uniform_real_distribution object; a and b correspond to
             the respective parameters of the distribution.

あなたの特定の例は、そのnumeric_limits要件をオーバーフローします。

これで、境界として/を使用してを作成できます。これは明確に定義されているはずです。また、あなたの例はほとんどの実装で動作する可能性があります (一般に内部計算で float を double に昇格させるため) が、未定義の動作をまだ実行しています。std::uniform_real_distribution<double>std::numeric_limits<float>::minmax

それが機能しない実装では、最も可能性の高い障害モードは 生成Infであると推測しb-aます。

于 2016-04-24T17:46:10.820 に答える