2012-06-19 21 views
35
सी ++ आईएसओ कल्पना के अनुसार

, § 26.2/2:क्यों सी ++ अनिवार्य है कि जटिल केवल फ्लोट, डबल, या लंबे डबल के लिए तत्काल हो?

से float, double या long double अनिर्दिष्ट है अन्य किसी भी प्रकार के लिए टेम्पलेट complex instantiating का प्रभाव।

मानक लेखक स्पष्ट रूप से इस प्रतिबंध को क्यों जोड़ देंगे? इससे यह अनिर्दिष्ट हो जाता है, उदाहरण के लिए, यदि आप complex<int> या complex<MyCustomFixedPointType> बनाते हैं और कृत्रिम प्रतिबंध की तरह लगता है तो क्या होता है।

क्या इस सीमा का कोई कारण है? यदि आप अपने खुद के कस्टम प्रकार के साथ complex को तुरंत चालू करना चाहते हैं तो क्या कोई कामकाज है?

मैं मुख्य रूप से this earlier question की वजह से इस सवाल का, जिसमें ओ पी क्यों abscomplex<int> के लिए विचित्र आउटपुट दे रहा था के रूप में उलझन में था पूछ रहा हूँ। उस ने कहा, यह अभी भी काफी समझ में नहीं आता है कि हम निश्चित रूप से complex संख्याओं को निश्चित-बिंदु प्रकारों, उच्च परिशुद्धता वास्तविक संख्याओं, आदि

+4

मुझे आपके पिछले उत्तर को देखने के बाद हंसना पड़ा, लेकिन यह वास्तव में एक अच्छा सवाल है। – chris

+9

@ क्रिस- मुझे उस उत्तर को उच्च स्तर का कारण देने में सक्षम होने के बिना बुरा लगा। मैं आमतौर पर कह रहा हूं कि यह एक्स, वाई, और जेड के कारण सी ++ का एक विचित्र एज केस है, लेकिन इस बार मुझे नहीं पता कि क्या हो रहा है। – templatetypedef

+4

"मानकीकरण जटिल पर समिति पर एक दशक से अधिक समय तक चर्चा की गई है और कम से कम एक विक्रेता से इसका समर्थन करने के लिए महत्वपूर्ण प्रतिरोध मौजूद है।" http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-March/020398।एचटीएमएल –

उत्तर

28

आप पूर्णांक पर std::complex संचालनों में से कई को सही ढंग से कार्यान्वित नहीं कर सकते हैं। जैसे,

template <class T> 
T abs(const complex<T> &z); 
एक complex<long> के लिए

T = long वापसी मान जब जटिल संख्या (असली, imag) जोड़े के रूप में प्रतिनिधित्व कर रहे हैं, क्योंकि यह sqrt(pow(z.real(), 2) + pow(z.imag(), 2)) का मान देता है नहीं हो सकता। केवल कुछ ही ऑपरेशन समझ में आएंगे।

इससे भी बदतर, polar नामक कन्स्ट्रक्टर को डिफॉल्ट कन्स्ट्रक्टर को तोड़ने के बिना विश्वसनीय नहीं बनाया जा सकता है और इसके विपरीत। मानक को यह निर्दिष्ट करना होगा कि "जटिल पूर्णांक" Gaussian integers उनके लिए किसी भी उपयोग के लिए हैं, और रचनाकारों में से एक गंभीर रूप से टूटा हुआ है।

अंत में, आप अपने "जटिल पूर्णांक विभाजन" को कैसे पसंद करेंगे, और क्या आप इसके साथ "जटिल शेष" पसंद करेंगे? :)

सारांश, मुझे लगता है कि इसे और अधिक std::complex पर अभिन्न T के लिए भ्रष्टाचार समर्थन से बस कुछ ही संचालन के साथ एक अलग gaussian_int<T> प्रकार निर्दिष्ट करने के समझदार होगा।

+1

मजेदार कैसे हमने चित्रण करने के लिए एक ही कार्य को चुना है। :) –

+0

निर्णय के लिए ठोस गणितीय कारण पेश करने के लिए धन्यवाद। मुझे लगता है कि यह निर्णय के लिए एक सुरुचिपूर्ण सैद्धांतिक कारण प्रदान करता है। मैंने पहले गॉसियन पूर्णांक के बारे में नहीं सुना था, इसलिए उन्हें लाने के लिए धन्यवाद! – templatetypedef

+0

@templatetypedef: प्रश्न के लिए धन्यवाद और +1। मैंने कभी नहीं सोचा था कि क्या होगा जब जटिल 'अभिन्न प्रकारों पर' जटिल 'टेम्पलेट किया गया था। [मैं गणितज्ञ नहीं हूं, और यदि कोई मुझे इस पर गलत साबित कर सकता है, तो कृपया करें।] –

12

संभवतः सहायक कार्यों के साथ संगतता के लिए बनाना चाहते हैं।

template<class T> T abs (const complex<T>& x); 

तो T == int, absint, जो परिशुद्धता में भारी नुकसान का मतलब होगा वापसी होगी: उदाहरण के लिए।