जी ++ में, विभिन्न अंतर्निहित गणित कार्य कुछ स्थितियों के तहत constexpr हैं। उदाहरण के लिए, निम्नलिखित संकलन:__builtin_round एक निरंतर अभिव्यक्ति नहीं है
static constexpr double A = __builtin_sqrt(16.0);
static constexpr double B = __builtin_pow(A, 2.0);
हालांकि वे हमेशा कॉन्स्टेक्स नहीं होते हैं, यह तर्क पर निर्भर करता है। उदाहरण के लिए, निरंतर अभिव्यक्ति के रूप में उपयोग किए जाने पर __builtin_sqrt(NAN)
संकलन त्रुटि में परिणाम देता है।
लेकिन मैं मुझे लगता है, जहां कि यह constexpr होना चाहिए एक अजीब मामला मार कर रहा हूँ, लेकिन यह नहीं है:
static constexpr double value() { return 1.23; }
static constexpr double result = __builtin_round(__builtin_sqrt(value()));
यह पैदा करता है:
a.cpp:2:73: error: ‘__builtin_round(1.1090536506409416e+0)’ is not a constant expression
static constexpr double result = __builtin_round(__builtin_sqrt(value()));
^
मैं रूपों की कोशिश की है उपरोक्त कोड के, और मैंने पाया है कि:
__builtin_round
समस्या में कुछ विशेष भूमिका है। इसेsqrt
याpow
जैसे कुछ अन्य अंतर्निहित गणित फ़ंक्शन के साथ प्रतिस्थापित करना त्रुटि को हल करता है। तो ऐसा लगता है कि__builtin_round
में केवल कॉन्सएक्स समर्थन की कमी है। लेकिन ...- यदि
value()
को एक शाब्दिक1.23
द्वारा प्रतिस्थापित किया गया है, तो यह भी त्रुटि को हटा देता है। __builtin_sqrt
को हटाकर, केवल__builtin_round(value())
छोड़कर, त्रुटि को भी हटा देता है।
मुझे यह जानना है कि round
इस तरह से व्यवहार क्यों कर रहा है, और यदि कोई कामकाज है।
नोट। मुझे पता है कि बिल्टिन गणित कार्य, उनके कॉन्स्टेक्स-नेस के साथ, एक गैर-मानक कंपाइलर-विशिष्ट सुविधा हैं। कृपया मुझे व्याख्यान न करें कि मुझे इसका उपयोग क्यों नहीं करना चाहिए, या मुझे संकलन समय गणित करने की कोशिश क्यों नहीं करनी चाहिए। मेरे मामले में, कॉन्स्टेक्स गणित होना एक महत्वपूर्ण विशेषता है, और मैं G ++ के आधार पर ठीक हूं।
गोल नहीं चल रहा है वर्तमान फ्लोटिंग पॉइंट राउंडिंग विधि पर निर्भर करता है, जिसे केवल रन टाइम पर जाना जाता है? –
@AlanStokes मैंने भी इतना सिखाया, लेकिन जीसीसी मानता है कि गोलाकार मोड संकलन समय पर किसी भी तरह से जाना जाता है। जीसीसी में '-फनो-राउंडिंग-गणित' विकल्प देखें। इसके अलावा, अगर यह उस कारण था, कम से कम सिद्धांत में बहुत सारे एफपी ऑपरेटर कंस्ट्रैक्स नहीं होंगे (जो कम से कम जी ++ में हैं, जो अधिकांश गणित कार्यों के समान हैं)। –