मुझे लगता है कि abs
और fabs
math.h
का उपयोग करते समय अलग-अलग व्यवहार कर रहे हैं। लेकिन जब मैं केवल cmath
और std::abs
का उपयोग करता हूं, तो क्या मुझे std::fabs
या fabs
का उपयोग करना होगा? या यह परिभाषित नहीं है?मैं fabs का उपयोग कब करता हूं और std :: abs का उपयोग करने के लिए पर्याप्त कब होता है?
उत्तर
सी ++ में, यह हमेशा std::abs
का उपयोग करने के लिए पर्याप्त है; यह सभी संख्यात्मक प्रकारों के लिए अधिभारित है।
सी में, abs
केवल पूर्णांक पर काम करता है, और आपको फ्लोटिंग पॉइंट मानों के लिए fabs
की आवश्यकता है। ये सी ++ (सी सी पुस्तकालय के साथ) में उपलब्ध हैं, लेकिन इनका उपयोग करने की कोई आवश्यकता नहीं है।
double
और float
तर्कों के लिए fabs
का उपयोग करना अभी भी ठीक है। मैं इसे पसंद करता हूं क्योंकि यह सुनिश्चित करता है कि अगर मैं को abs
से गलती से पट्टी कर दूं, तो व्यवहार फ़्लोटिंग पॉइंट इनपुट के लिए समान रहता है।
std::abs
के बजाय abs
का उपयोग करने की अपनी गलती के कारण मैंने बस इस समस्या को डीबग करने में 10 मिनट बिताए। मुझे लगता है कि using namespace std;
std::abs
का अनुमान लगाएगा लेकिन ऐसा नहीं हुआ, और इसके बजाय सी संस्करण का उपयोग कर रहा था।
वैसे भी, मुझे विश्वास है कि के बजाय के बजाय फ्लोटिंग-पॉइंट इनपुट के लिए अपने इरादे को स्पष्ट रूप से दस्तावेज करने के तरीके के रूप में उपयोग करना अच्छा है।
यह अजीब है। आपका कॉल अस्पष्ट (और इस प्रकार एक त्रुटि) सही होना चाहिए था? – Nick
क्या आप फ्लोट के लिए fabsf का उपयोग नहीं करना चाहिए? इसलिए मुझे नहीं लगता कि वे समान हैं। – Nick
एंड्रॉइड एनडीके जी ++ से सावधान रहें, यह std :: abs() के बजाय c abs() फ़ंक्शन को भी cedes। विजुअल स्टूडियो सी ++ कंपाइलर में हालांकि पेट हमेशा std :: abs() को इंगित करता है। – southerton
स्पष्ट रूप से फ़्लोटिंग-पॉइंट इनपुट के लिए std::fabs
की अनुशंसा करने का एक और कारण है।
आप <cmath> शामिल करने के लिए भूल जाते हैं, आपके std::abs(my_float_num)
std::abs(int)
बजाय std::abs(float)
हो सकता है। ध्यान देना मुश्किल है।
"abs" और "fabs" केवल सी ++ फ्लोट प्रकारों के लिए समान हैं, जब उन्हें अस्पष्ट अधिभार संदेशों के बिना अनुवादित किया जा सकता है।
मैं g ++ (g ++ - 7) का उपयोग कर रहा हूं। टेम्पलेट उपयोग के साथ-साथ विशेष रूप से जब mpreal का उपयोग करते हैं तो हार्ड "अस्पष्ट अधिभार" संदेशों के मामले होते हैं - abs(static_cast<T>(x))
हमेशा इसे हल नहीं करते हैं। जब पेट अस्पष्ट है, संभावना है कि fabs अपेक्षित के रूप में काम कर रहा है। Sqrt के लिए मुझे कोई आसान बच नहीं मिला।
सप्ताहों से मैं सी ++ "मौजूदा समस्याओं में नहीं" पर कड़ी मेहनत कर रहा हूं। मैं पहले से कहीं अधिक बेहतर टेम्पलेट उपयोग के लिए सी ++ 14 में एक पुराना सी ++ प्रोग्राम अपडेट कर रहा हूं। अक्सर एक ही टेम्पलेट पैरामीटर वास्तविक मानक फ्लोट या जटिल प्रकार या कक्षा प्रकार हो सकता है। क्यों, लंबे समय से दोहरे अन्य प्रकार की तुलना में कुछ और समझदार काम किया। सभी काम कर रहे थे, और मैंने पहले mpreal शामिल किया था। फिर मैं अपना डिफ़ॉल्ट फ्लोट प्रकार mpreal पर सेट कर रहा था और सिंटैक्स त्रुटियों का एक बहुल हो गया। जिसने हजारों संदिग्ध ओवरलोड को उदा। abs और sqrt के लिए, विभिन्न समाधानों के लिए रोना। कुछ को अधिभारित सहायता कार्यों की आवश्यकता थी, लेकिन एक टेम्पलेट के बाहर। ज़ीरो या वन या टाइप_कास्ट का उपयोग करके सटीक निरंतर प्रकार के साथ 0.0L और 1.0L के व्यक्तिगत रूप से हजारों उपयोगों को प्रतिस्थापित करना था - अस्पष्टता के कारण स्वचालित रूपांतरण परिभाषा असंभव थी।
मई तक मुझे निहित रूपांतरणों का अस्तित्व बहुत अच्छा लगा। लेकिन यह बिना किसी सरल के होगा, और किसी अन्य मानक निरंतर प्रकार के लिए सुरक्षित स्पष्ट टाइपकास्ट्स के साथ टाइपवे स्थिरांक होना चाहिए।
क्या यह हर मंच पर मामला है? Esp। विंडोज और मैक ओएस एक्स? या कम से कम सी ++ मानक में है? – math
@brubelsabs: हाँ। सी ++ में एक अलग फैब्स फ़ंक्शन की आवश्यकता नहीं है क्योंकि सी ++ ने ओवरलोडिंग कार्य किया है (पेट को कई प्रकार के लिए परिभाषित किया जा सकता है और यह सी ++ में है)। यह मानक द्वारा भी गारंटी दी जाती है। बेशक अगर आप 10 साल से अधिक पुराने पुराने कंपाइलर को खोदते हैं, तो आपको वह ऐसा मिल सकता है जो इसका समर्थन नहीं करता है। – stinky472
यह सी ++ मानक में है, इसलिए विंडोज और मैक ओएस एक्स सहित एक सभ्य कंपाइलर के साथ हर प्लेटफ़ॉर्म पर यह मामला है। खंड 26.5 का कहना है कि, सी लाइब्रेरी से 'int' संस्करण के अलावा,' लंबे समय तक ओवरलोड ', 'फ्लोट', 'डबल' और 'लम्बा डबल'। खंड 26.2.7 'जटिल' के लिए एक अधिभार भी परिभाषित करता है। –