जवाबों:
C ++ में, यह हमेशा उपयोग करने के लिए पर्याप्त है std::abs
; यह सभी संख्यात्मक प्रकारों के लिए अतिभारित है।
सी में, abs
केवल पूर्णांक पर काम करता है, और आपको fabs
फ्लोटिंग पॉइंट वैल्यू की आवश्यकता होती है । ये C ++ (C लाइब्रेरी के सभी के साथ) में उपलब्ध हैं, लेकिन इनका उपयोग करने की कोई आवश्यकता नहीं है।
int
सी पुस्तकालय से संस्करण, वहाँ के लिए भार के हैं long
, float
, double
और long double
। खण्ड 26.2.7 भी एक अधिभार को परिभाषित करता है complex
।
std::
और बस उपयोग करते हैं abs
, तो आपका कोड खिड़कियों पर अपेक्षित रूप से काम करेगा लेकिन int
लिनक्स पर संस्करण का उपयोग करेगा , जो डिबग करने के लिए अविश्वसनीय रूप से कठिन हो सकता है।
इसके fabs
लिए double
और float
तर्कों का उपयोग करना अभी भी ठीक है । मैं इसे पसंद करता हूं क्योंकि यह सुनिश्चित करता है कि अगर मैं गलती से std::
बंद कर abs
दूं, तो फ्लोटिंग पॉइंट इनपुट्स के लिए व्यवहार समान रहता है।
मैंने सिर्फ 10 मिनट बिताए, इस समस्या को दूर करने के लिए, abs
इसके बजाय उपयोग करने की अपनी गलती के कारण std::abs
। मैंने मान लिया कि यह using namespace std;
अनुमान लगाएगा, std::abs
लेकिन यह नहीं था, और इसके बजाय सी संस्करण का उपयोग कर रहा था।
वैसे भी, मेरा मानना है कि फ़्लोटिंग-पॉइंट इनपुट के fabs
बजाय इसका उपयोग abs
अपने इरादे को स्पष्ट रूप से प्रलेखित करने के लिए करना अच्छा है ।
std::abs
हमेशा अतिभारित होने का आह्वान किया जाता है (और सी-संस्करण नहीं abs
) जब तक फोन किया abs
जाता है, तब तक using namespace std;
विस्फोट हो जाता है इसकी शुरुआत हुई। मुझे नहीं पता कि यह संकलक विशिष्ट है या नहीं।
std::fabs
फ्लोटिंग-पॉइंट इनपुट के लिए स्पष्ट रूप से सिफारिश करने का एक और कारण है ।
यदि आप <cmath> को शामिल करना भूल जाते हैं, तो आपके बजाय std::abs(my_float_num)
हो सकता std::abs(int)
है std::abs(float)
। यह नोटिस करना मुश्किल है।
"एब्स" और "फैब्स" केवल C ++ फ्लोट प्रकारों के लिए समान हैं, जब उन्हें अस्पष्ट अधिभार संदेशों के बिना अनुवाद किया जा सकता है।
मैं g ++ (g ++ - 7) का उपयोग कर रहा हूं। टेम्पलेट के उपयोग के साथ साथ और विशेष रूप से जब mpreal का उपयोग करते हैं तो हार्ड "अस्पष्ट अधिभार" संदेशों के मामले होते हैं - abs(static_cast<T>(x))
जो हमेशा हल नहीं होते हैं। जब एब्स अस्पष्ट होता है, तो संभावना है कि फ़ैब्स उम्मीद के मुताबिक काम कर रहे हैं। Sqrt के लिए मुझे ऐसा कोई सरल बच नहीं मिला।
सप्ताह के बाद से मैं सी ++ पर कठिन संघर्ष कर रहा हूं "मौजूदा समस्याएं नहीं"। मैं पहले से अधिक और बेहतर टेम्पलेट उपयोग के लिए C ++ 14 के लिए एक पुराने C ++ प्रोग्राम को अपडेट कर रहा हूं। अक्सर एक ही टेम्पलेट पैरामीटर वास्तविक किसी भी मानक फ्लोट या जटिल प्रकार या एक वर्ग प्रकार हो सकता है। कभी क्यों, लंबे डबल ने अन्य प्रकारों की तुलना में कुछ अधिक समझदार अभिनय किया। सभी काम कर रहे थे, और मैंने पहले भी एमप्रियल को शामिल किया था। तब मैं अपने डिफ़ॉल्ट फ्लोट प्रकार को mpreal सेट कर रहा था और सिंटैक्स त्रुटियों का एक जलप्रलय मिला। एब्स और स्क्वेयर के लिए हजारों अस्पष्ट ओवरलोड हैं, जो विभिन्न समाधानों के लिए रो रहे हैं। कुछ को ओवरलोड सहायता कार्यों की आवश्यकता थी, लेकिन एक टेम्पलेट के बाहर। जीरो या वन या एक टाइप_कास्ट का उपयोग करके सटीक निरंतर प्रकार के साथ व्यक्तिगत रूप से 0.0L और 1.0L के एक हजार usages को बदलना था - अस्पष्टता के कारण असंभव स्वचालित रूपांतरण परिभाषा।
मई तक मुझे निहित रूपांतरणों की मौजूदगी बहुत अच्छी लगी। लेकिन बहुत सरल यह किसी भी बिना होगा, और किसी अन्य मानक स्थिर प्रकार के लिए सुरक्षित स्पष्ट type_casts के साथ टाइपसेस्ट स्थिरांक होना।