2011-01-13 12 views
5

基本的には、値の束から最小の(正の)値を検索し、最初の値と比較するためにデフォルト値が必要です。純粋な前提は、彼らが常にと比較して「より小さい」(NaNを除いて、それらを考慮しません)ですが、私は確信していません。任意の浮動小数点値はどのように無限大と比較されますか?

私はfloatタイプを使用しています。ターゲットハードウェアが無限大を実装していると見なすことができます。

は、ここではいくつかのサンプルコードです:IEEE 754個の浮動小数点数については

auto leastValue = std::numeric_limits<float>::infinity(); 
for (auto i = something.begin(), e = something.end(); i != e; ++i) 
{ 
    auto value = (*i)->GetValue(); 
    if (value < leastValue) 
    { 
    leastValue = value; 
    } 
} 
+4

また、最初の値を初期値として使用することもできます。あなたが無限に置くなら、それはおそらくまだ機能します。私はちょうどあなたが実際に特別なinital値を使用する必要はないことを指摘しています。 –

+0

ループから 'i'を引き出し、空のコレクションの追加チェックを追加することで、できました。しかし、それは問題を役に立たなくするでしょうか? ;) – kiw

+0

'std :: min_element'を使って、そのようなことを心配させますか? –

答えて

8

は、NaNと無限大を除いて、すべてが無限大よりも小さいです。あなたのプラットフォーム上にそれらを持つ可能性があります。あなたがうつ病の場合は、numeric_limits<float>::is_iec559で確認してください。プラットフォームが準拠していない場合は、numeric_limits<float>::max()を使用してください。あなたのシーケンスが空でない場合、それは間違った結果を与えることはありません。

2

私はマイケル・マドセンのコメントをサポートしています。変数にあなたの束の最初の値

店、あなたはこのテストのために無限の価値を必要としないし、次に束の第二の値を使用してテストを開始します。 (そしてそれはあなたに1つのテストを保存します:P)

0

これは、シーケンスが空の場合にどのような動作が期待されるかによって異なります。無限大が必要な場合は、実装は問題ありません。それ以外の場合は、最初の値を使用する必要があります。

auto i = something.begin(); 
auto e = semething.end(); 
if (i == e) 
    throw std::exception("empty sequence"); 

auto leastValue = (*i)->GetValue(); 

for (++i; i != e; ++i) 
{ 
    auto value = (*i)->GetValue(); 
    if (value < leastValue) 
    { 
    leastValue = value; 
    } 
} 
+0

シーケンスが空の場合、Infinityは実際に正しい答えです。シーケンスが空でない場合は、すべてのelementyが値を返すわけではないので、正解とすることもできます(これは私のコード例ではありません)。 – kiw

関連する問題