2011-01-13 75 views
5

基本上我想從一堆值中搜索最小值(正值),並需要一個默認值與第一個值進行比較。天真的假設是,他們總是比較「小於」(除NaNs,但我們不考慮這些),但我不太確定。任意浮點值如何與無窮大進行比較?

我使用的是float類型,我認爲可以安全地假設我的目標硬件實現了無窮大值。

下面是一些示例代碼:

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

您也可以使用第一個值作爲初始值。如果你投入無窮大,它很可能仍然有效;我只是指出,你實際上並不需要*使用特殊的初始值。 – 2011-01-13 00:33:12

+0

把`i`從循環中拉出來,併爲空集合添加一個額外的檢查,我就可以。但是會不會使問題變得無用? ;) – kiw 2011-01-13 00:39:10

回答

8

對於IEEE 754輛彩車,除了楠無限,一切都小於無窮大。有機會,你會在你的平臺上有這些。如果您偏執,請與numeric_limits<float>::is_iec559聯繫。如果您的平臺碰巧不合格,請使用numeric_limits<float>::max();如果你的序列不是空的,它不會給你一個錯誤的結果。

2

我支持邁克爾·馬德森評論:你不需要無限價值爲這個測試,

Store中的一堆變量的第一個值,然後用這束的第二個值開始你的測試。 (它甚至會爲您節省一次測試: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; 
    } 
}