मैं std::complex<>अपने कार्यक्रमों में उपयोग करता हूं, और प्रत्येक नए संकलक या संकलक उन्नयन के लिए संकलक झंडे और वर्कअराउंड के साथ लड़ना पड़ता है। मैं कालानुक्रमिक क्रम में इन झगड़ों को याद करने की कोशिश करूंगा:
std::norm|z|2|z|-ffast-math
- लाइनक्स (या लिंकर) पर इंटेल आईसीसी कंपाइलर
std::argकुछ कॉन्फ़िगरेशन (एक विशिष्ट जीसी-संस्करण के साथ लिंक संगतता) के तहत एक गैर-ऑप्ट करने के लिए संकलित किया गया है। समस्या बहुत बार std::argबदल गई , इसलिए इसे प्रतिस्थापित करना पड़ा atan2(imag(),real())। लेकिन नया कोड लिखते समय यह सब भूलना बहुत आसान था।
- प्रकार
std::complexबिल्ट-इन C99 कॉम्प्लेक्स प्रकार की तुलना में अलग कॉल कन्वेंशन (= ABI) का उपयोग करता है, और नए gcc संस्करणों के लिए अंतर्निहित फोरट्रान कॉम्प्लेक्स प्रकार।
-ffast-mathअप्रत्याशित तरीके से बिंदु अपवाद चल की हैंडलिंग के साथ संकलन ध्वज का आदान प्रदान। क्या होता है कि संकलक विभाजनों को छोरों से बाहर खींचता है, जिससे division by zeroरनटाइम पर अपवाद होता है। ये अपवाद लूप के अंदर कभी नहीं हुए होंगे, क्योंकि आसपास के तर्क के कारण संबंधित विभाजन नहीं हुआ था। यह वास्तव में बुरा था, क्योंकि यह एक पुस्तकालय था जिसे प्रोग्राम से अलग करके संकलित किया गया था जो फ्लोटिंग पॉइंट अपवाद हैंडिंग (विभिन्न संकलित झंडे का उपयोग करते हुए) का उपयोग करता था और इन मुद्दों में चलता था (इसी टीम दुनिया के विपरीत हिस्सों में बैठे थे, इसलिए इस मुद्दे ने वास्तव में बुरी परेशानी पैदा की)। यह संकलक द्वारा उपयोग किए गए अनुकूलन को अधिक सावधानी से हाथ से हल किया गया था।
- पुस्तकालय कार्यक्रम का हिस्सा बन गया और अब
-ffast-mathसंकलन ध्वज का उपयोग नहीं किया गया । नए gcc संस्करण में अपग्रेड के बाद, प्रदर्शन एक विशाल कारक द्वारा गिरा दिया गया। मैंने अभी तक इस मुद्दे की विस्तार से जांच नहीं की है, लेकिन मुझे डर है कि यह C99 अनुलग्नक G से संबंधित है । मुझे स्वीकार करना होगा कि मैं जटिल संख्याओं के लिए गुणा की इस अजीब परिभाषा से पूरी तरह से भ्रमित हूं, और यहां तक कि इसके विभिन्न संस्करणों का दावा करने के लिए मौजूद है कि अन्य संस्करणों को गुमराह किया गया है। मुझे उम्मीद है कि -fcx-limited-rangeसंकलन ध्वज इस मुद्दे को हल करेगा, क्योंकि -ffast-mathइस नए gcc संस्करण के लिए इससे संबंधित एक और समस्या प्रतीत होती है ।
-ffast-mathसंकलन ध्वज के व्यवहार करता है NaNजीसीसी के नए संस्करणों के लिए पूरी तरह से अप्रत्याशित (यहां तक कि isnanप्रभावित होता है)। NaNकार्यक्रम में किसी भी घटना से बचने के लिए एकमात्र समाधान दिखता है , जो अस्तित्व के उद्देश्य को पराजित करता है NaN।
अब आप पूछ सकते हैं कि क्या मैं अंतर्निहित जटिल प्रकारों को छोड़ने के std::complexलिए और इन कारणों से योजना बना रहा हूं । मैं अंतर्निहित प्रकारों के साथ रहूंगा, जब तक मैं C ++ के साथ रहता हूं। मामले में C ++ को वैज्ञानिक कंप्यूटिंग के लिए पूरी तरह से अनुपयोगी बनने का प्रबंधन करना चाहिए, मैं इसके बजाय एक ऐसी भाषा पर स्विच करने पर विचार करूंगा जो वैज्ञानिक कंप्यूटिंग के लिए प्रासंगिक मुद्दों का अधिक ध्यान रखे।
zप्रकार का एक lvalue अभिव्यक्ति है सीवीstd::complex<T>तोreinterpret_cast<cv T(&)[2]>(z)औरreinterpret_cast<cv T(&)[2]>(z)[0]का असली हिस्सा नामित करेगाz, औरreinterpret_cast<cv T(&)[2]>(z)[1]के काल्पनिक भाग नामित करेगाz। जटिल संख्याओं की सरणियों को भी संबोधित किया जाता है।