2011-01-13 11 views
5

असल में मैं मूल्यों के समूह से सबसे छोटे (सकारात्मक) मूल्य की खोज करना चाहता हूं और पहले की तुलना करने के लिए डिफ़ॉल्ट मान की आवश्यकता है। भरोसेमंद धारणा होगी, वे हमेशा "से कम" की तुलना करें (NaN को छोड़कर, लेकिन उन पर विचार न करें) लेकिन मुझे पूरा यकीन नहीं है।मनमाने ढंग से फ़्लोटिंग पॉइंट मान अनंतता की तुलना कैसे करते हैं?

मैं 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

आप अपने प्रारंभिक मूल्य के रूप में पहले मान का भी उपयोग कर सकते हैं। यदि आप अनंतता में डालते हैं तो यह अभी भी काम करेगा; मैं बस यह इंगित कर रहा हूं कि आपको एक विशेष आंतरिक मूल्य का उपयोग करने के लिए वास्तव में * आवश्यकता नहीं है। –

+0

लूप से 'i' खींचने और खाली संग्रह के लिए अतिरिक्त जांच जोड़ने के साथ, मैं कर सकता था। लेकिन क्या यह सवाल बेकार नहीं होगा? ;) – kiw

+0

'std :: min_element' का उपयोग करें और इसे इस तरह की चीजों के बारे में चिंता करने दें? –

उत्तर

8

आईईईई 754 तैरता के लिए, NaN और अनंत को छोड़कर, सब कुछ अनंत से कम है। संभावना है कि आप अपने मंच पर होंगे। यदि आप पागल हैं, तो numeric_limits<float>::is_iec559 से जांचें। यदि आपका प्लेटफ़ॉर्म अनुरूप नहीं होता है, तो numeric_limits<float>::max() का उपयोग करें; यदि आपका अनुक्रम अस्वीकार है, तो यह आपको गलत परिणाम नहीं देगा।

2

मैं समर्थन माइकल मैडसन टिप्पणी: आप इस परीक्षण के लिए एक अनंत मूल्य की जरूरत नहीं है

स्टोर एक चर में अपने गुच्छा के पहले मूल्य और फिर गुच्छा के दूसरे मूल्य के साथ अपने परीक्षण शुरू करते हैं। (और यह आपको एक परीक्षण भी बचाएगा: पी)

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

अनुक्रम खाली होने पर वास्तव में सही जवाब सही जवाब है। अनुक्रम खाली नहीं होने पर यह सही उत्तर भी हो सकता है, क्योंकि सभी तत्व एक मूल्य उत्पन्न नहीं करते हैं (जो मेरे उदाहरण कोड में नहीं था)। – kiw

संबंधित मुद्दे