2015-07-03 12 views
17

धारा 26.5.1.1 पैरा सी ++ 11 मानक (N3242) की 1 का कहना है:सी ++ 11 यादृच्छिक संख्या जनरेटर UIntType विरोधाभास

इस उपखंड 26.5 दौरान एक टेम्पलेट instantiating का प्रभाव:

[...]

च) एक टेम्पलेट प्रकार UIntType नामित पैरामीटर है कि अपरिभाषित जब तक इसी टेम्पलेट तर्क सीवी-अयोग्य है और unsigned short में से एक, unsigned int है, 0,123,, या unsigned long long

और यह 26.5.3.1 में रैखिक संगत जनरेटर को परिभाषित करता है। वर्ग की परिभाषा इस तरह शुरू होता है:

template<class UIntType, UIntType a, UIntType c, UIntType m> 
class linear_congruential_engine 

minstd_rand0 इस प्रतिबंध का उल्लंघन लगता है:

typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> 
    minstd_rand0; 

यह uint_fast32_t का उपयोग करता है के रूप में (जो unsigned short में से एक, unsigned int, unsigned long होने की गारंटी नहीं है, या unsigned long long) minstd_rand0 में UIntType नामक टेम्पलेट पैरामीटर के लिए, ऐसा लगता है कि #include <random> पर कम से कम प्रभाव पड़ता है, या कम से कम minstd_rand0 का उपयोग करने के लिए। यह समस्या अन्य पूर्वनिर्धारित आरएनजी पर भी लागू होती है, और यह C++ 14 में ठीक नहीं लगती है।

मेरे प्रश्न हैं:

  • यह वास्तव में एक विरोधाभास (या बल्कि अपरिभाषित व्यवहार का एक चरम राशि) है, या मैं कुछ याद है?
  • क्या इसका दोष दोष रिपोर्ट में उल्लेख किया गया है?

संपादित करें: मैं देखा है कि this दोष रिपोर्ट इस समस्या से संबंधित जा रहा है।

+0

ठीक है, * आवश्यक व्यवहार * खंड जो तुरंत इसका पालन करता है, तर्कसंगत रूप से इस तरह की चीज को अच्छी तरह परिभाषित करने की आवश्यकता है। भले ही, क्या कोई वास्तविक प्रणाली है जिसमें 'uint_fast32_t' * उन प्रकारों में से एक नहीं है? –

+0

@ टी.सी. मुझे लगता है कि यह हो सकता है, लेकिन मुझे लगता है कि यह केवल 10000 वें आमंत्रण को सही होने की आवश्यकता है। 10001 वें आमंत्रण अभी भी एक समस्या का कारण बन सकता है (या उस मामले के लिए, एक इंजन जो डिफ़ॉल्ट रूप से निर्मित नहीं था)। – qbt937

+0

@ टी.सी. एमएसवीसी 'unintigned __int32't' का उपयोग करके' uint_fast32_t' को परिभाषित कर सकता है (मुझे नहीं पता कि मैं एमएसवीसी का उपयोग नहीं करता)। मैं मानता हूं कि यह प्रश्न अकादमिक है हालांकि। – qbt937

उत्तर

0

मैं कोई विशेषज्ञ नहीं हूं, लेकिन मेरा जवाब यह है कि हाँ यह एक दोष है, यदि आप सही हैं तो uint_fast32_t मानक के अनुसार उन प्रकारों में से एक होने की आवश्यकता नहीं है।

आपके द्वारा संदर्भित एनएडी मुद्दे 2326 में प्रस्ताव इस दोष को हल करने के लिए प्रतीत होता है।

1

हां और नहीं। प्रति खंड 18.4.1, uint_fast32_t एक हस्ताक्षरित पूर्णांक प्रकार के लिए उपनाम होना चाहिए। जबकि सी ++ में एकमात्र हस्ताक्षरित पूर्णांक प्रकार असाइन किए गए चार, लघु, int, लंबे, लंबे, लंबे (3.9.1) हैं, इसलिए आपके द्वारा वर्णित अनुभाग का एकमात्र परिदृश्य एक विरोधाभास हो सकता है कि char किसी भी तरह 32-बिट या व्यापक है और और uint_fast32_t को बिना किसी हस्ताक्षरित चार के उपनाम के लिए परिभाषित किया गया है।

1

uint_fast32_t कम से कम 32 बिट्स की चौड़ाई के साथ सबसे तेज़ हस्ताक्षरित पूर्णांक प्रकार के रूप में निर्दिष्ट किया गया है।

सी ++ प्रकार प्रणाली में, चरित्र और पूर्णांक प्रकार दोनों अभिन्न प्रकार हैं, लेकिन चरित्र प्रकार पूर्णांक प्रकार नहीं हैं (न ही इसके विपरीत)।

अंत में, हस्ताक्षरित पूर्णांक प्रकार बिल्कुल यादृच्छिक जनरेटर के लिए गणना किए गए हैं।

मेरा निष्कर्ष यह है कि uint_fast32_t मानक का अनुपालन करता है (जब तक कि मैं मानक के कुछ हिस्से को याद नहीं करता जहां इसे विशेष रूप से uint_fast32_t के लिए nonstsndard प्रकार होने की अनुमति दी जाती है, या पूर्णांक प्रकार की परिभाषा के लिए गैर मानक प्रकार शामिल करने के लिए)।

हालांकि, मुझे विश्वास है कि कल्पना को अस्पष्ट व्याख्याओं से बचने के लिए तय किया जाना चाहिए।

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