2013-03-15 8 views
6

सी ++ में, मान लें मैं प्रकार T के एक नंबर x जो एक पूर्णांक या चल बिन्दु प्रकार किया जा सकता है चलो। मैं प्रकार T जिसके लिए y < x धारण की संख्या सबसे अधिक y लगाना चाहते हैं। समाधान को दोनों पूर्णांक और फ़्लोटिंग पॉइंट नंबरों के साथ पारदर्शी रूप से काम करने के लिए टेम्पलेट करने की आवश्यकता है। आप किनारे के मामले को अनदेखा कर सकते हैं जहां x पहले से ही सबसे छोटा नंबर है जिसे T में प्रदर्शित किया जा सकता है।सबसे बड़ी संख्या <x?

संभावित उपयोग केस: यह प्रश्न बहुत स्थानीयकृत के रूप में चिह्नित किया गया था, इसलिए मैं एक ऐसा उपयोग केस प्रदान करना चाहता हूं जो मुझे लगता है कि यह अधिक सामान्य है। ध्यान दें कि मैं ओपी का मूल लेखक नहीं हूं।

struct lower_bound { 
    lower_bound(double value, bool open) : value(open? value+0.1 : value) {} 
    double value; 
    bool operator()(double x) { return x >= value; } 
}; 

इस वर्ग के एक निचली सीमा है जो या तो खुली या बंद किया जा सकता है simulates:

इस संरचना पर विचार करें। बेशक, असली (पन इरादा) जीवन में हम यह नहीं कर सकते हैं। बह असंभव (या कम से कम काफी मुश्किल) के लिए एस सभी वास्तविक संख्या जा रहा है की गणना करने के लिए है।

enter image description here

हालांकि, जब एस चल बिन्दु संख्या का सेट है, यह एक बहुत ही मान्य सिद्धांत है, क्योंकि हम अनिवार्य रूप से एक गणनीय सेट के साथ काम कर रहे हैं; और फिर खुली या बंद बाउंड जैसी कोई चीज नहीं है। यही है,> = को निम्न_बाउंड कक्षा में किए गए कार्यों के अनुसार परिभाषित किया जा सकता है।

कोड सादगी के लिए मैं 0.1 इस्तेमाल किया एक खुले लोअर बाउंड अनुकरण करने के लिए। बेशक, 0.1 एक कच्चे मूल्य के रूप में वहाँ मूल्यों z इस तरह हो सकता है कि मूल्य < z < = मूल्य + 0.1 या मूल्य + 0.1 == एक चल बिन्दु प्रतिनिधित्व में मूल्य।

struct lower_bound { 
    lower_bound(double value, bool open) : open(open), value(value) {} 
    bool open; 
    double value; 
    bool operator()(double x) { return (open ? x > value : x>=value); } 

}; 

हालांकि, इस sizeof (LOWER_BOUND), बड़ा है और ऑपरेटर के रूप में कम कुशल है() की जरूरत है: इसलिए @ ब्रेट-चुस्त जवाब बहुत उपयोगी :)

आप किसी अन्य सरल समाधान के बारे में सोच सकते हैं है एक और जटिल कथन निष्पादित करने के लिए। पहला कार्यान्वयन वास्तव में कुशल है, और संरचना के बजाए इसे डबल के रूप में भी लागू किया जा सकता है। तकनीकी रूप से, दूसरे कार्यान्वयन का उपयोग करने का एकमात्र कारण यह है कि आप मानते हैं कि एक डबल निरंतर है, जबकि यह नहीं है और मुझे लगता है कि यह निकट भविष्य में कहीं भी नहीं होगा।

मुझे आशा है कि मैं पैदा की है और एक वैध उपयोग के मामले में विस्तार से बताया है, और मैं मूल लेखक नाराज नहीं डाले हैं।

+1

तुम क्या यह चल बिन्दु प्रकार के लिए किया जाएगा का एक उदाहरण दे सकते हैं? क्या इसका मतलब है कि 'वाई' का मंथिसा एक बिट से छोटा है और एक्सपोनेंट वही है? – angelatlarge

+3

मुझे 27.5k उपयोगकर्ता से अधिक की उम्मीद है। –

+0

क्या .. आप कुछ भी कोशिश करते हैं? – Rapptz

उत्तर

11

यदि आप सी ++ 11, आप <cmath> में std::nextafter इस्तेमाल कर सकते हैं है:

if (std::is_integral<T>::value) 
    return (x - 1); 
else 
    return std::nextafter(x, - std::numeric_limits<T>::infinity()); 
+0

[x-1.0 फ़्लोटिंग प्रकारों के लिए x के बराबर हो सकता है, और यह कई संख्याओं के लिए होता है> = ~ 33554432] (http : //coliru.stacked-crooked.com/view? id = cc0ae3f34df4c559275ba1290458f077-61c3814520a8d4318f681038dc4b4da7) –

+0

@MooingDuck - हाँ धन्यवाद। यह जल्दबाजी में था। मैं रिश्तेदार बनाम पूर्ण ute त्रुटि। –

+0

@ ब्रेटहेल: आसान निरीक्षण करने के लिए, मुझे यकीन है कि यह मेरे कोड पर भी है। –

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