2016-04-24 6 views
6

अगर मैं निम्नलिखित तरीके से चल बिन्दु मान उत्पादन करने के लिए किए गए:"न्यूनतम से अधिकतम" वर्दी वास्तविक वितरण उत्पाद Inf, -Inf, या NaN होगा?

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>(); 
//... 

यह संभव है कि मैं कभी भी एक NaN, Inf, या -Inf वापस मिल जाएगा है?

+1

यह देखते हुए कि उनमें से कोई भी सीमा [मिनट, अधिकतम] के भीतर आता है, तो संभवतः नहीं। –

उत्तर

9

मान लें कि std::uniform_real_distribution उत्पन्न करता है।

यादृच्छिक फ्लोटिंग प्वाइंट मान मैं, समान रूप से अंतराल [क, ख)

तो, कि std::numeric_limits<foat>::min() और std::numeric_limits<float>::max(), पूर्व सहित, लेकिन बाद छोड़कर के बीच है पर वितरित उत्पन्न करता है। उन सीमाओं के मूल्य क्या हैं? वे FLT_MIN और FLT_MAX क्रमशः लौटते हैं। खैर, वो क्या हैं?

न्यूनतम सामान्यीकृत सकारात्मक फ्लोटिंग प्वाइंट नंबर

अधिकतम प्रदर्शनीय परिमित फ्लोटिंग प्वाइंट नंबर

के बाद से न तो {सकारात्मक, नकारात्मक} अनंत, और न ही NaN परिमित संख्या की सीमा के भीतर है , नहीं, वे उत्पन्न नहीं हुए हैं।

के रूप में, क्रिस्टोफर Oicles से कहा कि FLT_MIN ध्यान देना और विस्तार से, std::numeric_limits<foat>::min() छोटी से छोटी सकारात्मक प्रदर्शनीय मूल्य है।

के रूप में, अगर[min, max) की सीमा से अधिक है std::numeric_limits<float>::max() क्रिस डोड द्वारा बताया, तो आप अपरिभाषित व्यवहार मिलता है और उस मामले में किसी भी उत्पादन, पैदा अनंत सहित संभव हो जाएगा।

+1

फ़्लोटिंग-पॉइंट प्रकारों के लिए, 'std :: numeric_limits :: min()' एक सकारात्मक मान (सबसे छोटा nonzero सकारात्मक मान) है।और अंतर: 'std :: numeric_limits :: अधिकतम() - std :: numeric_limits :: min()' आमतौर पर 'std :: numeric_limits के बराबर समाप्त होता है :: अधिकतम()' (निश्चित रूप से अधिक नहीं, किसी भी मामले)। इसलिए मुझे यकीन नहीं है कि ट्रेवर को इसके बारे में पता था या नहीं, लेकिन उनकी रेंज पसंद वितरण से अपरिभाषित व्यवहार से बचने के लिए प्रबंधन करती थी। –

+0

@ क्रिस्टोफरऑनिक्स अच्छा बिंदु, मुझे यह एहसास नहीं हुआ था। मैंने अपने जवाब में शामिल किया है। – user2079303

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 आवश्यकता अतिप्रवाह होगा।

अब आप एक std::uniform_real_distribution<double>std::numeric_limits<float>::min/max सीमा के रूप में के साथ बना सकते हैं, और कहा कि अच्छी तरह से परिभाषित किया जाना चाहिए। यह भी संभावना है कि आपका उदाहरण अधिकांश कार्यान्वयन पर काम करेगा (क्योंकि वे आम तौर पर आंतरिक गणनाओं में युगल के लिए फ्लोट को बढ़ावा देते हैं), लेकिन यह अभी भी अपरिभाषित व्यवहार को मार रहा है।

कार्यान्वयन पर जहां यह काम नहीं करता है, मुझे लगता है कि सबसे संभावित विफलता मोड Inf उत्पन्न करेगा, जैसा कि b-a उत्पन्न होगा।

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