मैं कब fabs का उपयोग करता हूं और कब std का उपयोग करना पर्याप्त होता है :: abs?


100

मुझे लगता है कि absऔर fabsउपयोग करते समय अलग व्यवहार कर रहे हैं math.h। लेकिन जब मैं बस का उपयोग करता हूं cmathऔर std::abs, क्या मुझे उपयोग करना है std::fabsया fabs? या यह परिभाषित नहीं है?

जवाबों:


124

C ++ में, यह हमेशा उपयोग करने के लिए पर्याप्त है std::abs; यह सभी संख्यात्मक प्रकारों के लिए अतिभारित है।

सी में, absकेवल पूर्णांक पर काम करता है, और आपको fabsफ्लोटिंग पॉइंट वैल्यू की आवश्यकता होती है । ये C ++ (C लाइब्रेरी के सभी के साथ) में उपलब्ध हैं, लेकिन इनका उपयोग करने की कोई आवश्यकता नहीं है।


क्या हर मंच पर यही है? Esp। विंडोज और मैक ओएस एक्स? या यह कम से कम C ++ मानक में है?
गणित

3
@brubelsabs: हाँ। C ++ में एक अलग fabs फ़ंक्शन की कोई आवश्यकता नहीं है क्योंकि C ++ में फ़ंक्शन ओवरलोडिंग है (एब्स को कई प्रकारों के लिए परिभाषित किया जा सकता है और यह C ++ में है)। यह मानक द्वारा भी गारंटी है। बेशक, अगर आप 10 साल से अधिक पुराने कुछ संकलक खोजने के लिए खुदाई करते हैं, तो आपको वह मिल सकता है जो इसका समर्थन नहीं करता है।
बदबूदार 472

1
यह सी ++ स्टैंडर्ड में है, तो यह विंडोज और मैक ओएस एक्स खण्ड 26.5 सहित एक सभ्य संकलक, के साथ हर मंच पर मामला है कि कहते हैं, के अलावा intसी पुस्तकालय से संस्करण, वहाँ के लिए भार के हैं long, float, doubleऔर long double। खण्ड 26.2.7 भी एक अधिभार को परिभाषित करता है complex
माइक सेमोर

6
यदि आप भूल जाते हैं std::और बस उपयोग करते हैं abs, तो आपका कोड खिड़कियों पर अपेक्षित रूप से काम करेगा लेकिन intलिनक्स पर संस्करण का उपयोग करेगा , जो डिबग करने के लिए अविश्वसनीय रूप से कठिन हो सकता है।
एडवर्सस

" सभी संख्यात्मक प्रकार" [उद्धरण वांछित]। मैं int, long, long long, std :: intmax_t, फ्लोट, डबल, लॉन्ग डबल देख सकता हूं। कोई छोटा या चार संस्करण (या अहस्ताक्षरित संस्करण) जो मैं देख सकता हूं।
user673679

23

इसके fabsलिए doubleऔर floatतर्कों का उपयोग करना अभी भी ठीक है । मैं इसे पसंद करता हूं क्योंकि यह सुनिश्चित करता है कि अगर मैं गलती से std::बंद कर absदूं, तो फ्लोटिंग पॉइंट इनपुट्स के लिए व्यवहार समान रहता है।

मैंने सिर्फ 10 मिनट बिताए, इस समस्या को दूर करने के लिए, absइसके बजाय उपयोग करने की अपनी गलती के कारण std::abs। मैंने मान लिया कि यह using namespace std;अनुमान लगाएगा, std::absलेकिन यह नहीं था, और इसके बजाय सी संस्करण का उपयोग कर रहा था।

वैसे भी, मेरा मानना ​​है कि फ़्लोटिंग-पॉइंट इनपुट के fabsबजाय इसका उपयोग absअपने इरादे को स्पष्ट रूप से प्रलेखित करने के लिए करना अच्छा है ।


2
वह अजीब है। आपकी कॉल अस्पष्ट (और इस प्रकार एक त्रुटि) सही होनी चाहिए?
निक

आप फ्लोट के लिए fabsf का उपयोग नहीं किया जाना चाहिए? इसलिए मुझे नहीं लगता कि वे समान हैं।
निक

Android NDK g ++ से सावधान रहें, यह cd abs () फ़ंक्शन के बजाय std :: abs () का भी उल्लेख करता है। Visual Studio c ++ कंपाइलर में हालांकि abs हमेशा std को इंगित करता है :: abs ()।
11

@ ठीक है, मुझे लगता है कि मैं आपसे सहमत हूं: मुझे एलन ट्यूरिंग का वह व्यवहार नहीं लगता है, क्योंकि मेरे लिए std::absहमेशा अतिभारित होने का आह्वान किया जाता है (और सी-संस्करण नहीं abs) जब तक फोन किया absजाता है, तब तक using namespace std;विस्फोट हो जाता है इसकी शुरुआत हुई। मुझे नहीं पता कि यह संकलक विशिष्ट है या नहीं।
मविप्रणव

@ कोई त्रुटि नहीं है क्योंकि एक फ़ंक्शन नाम है जो मेल खाता है। यह क्रियान्वित परिभाषित है कि किसे चुना जाएगा।
पाटो सांडा

11

std::fabsफ्लोटिंग-पॉइंट इनपुट के लिए स्पष्ट रूप से सिफारिश करने का एक और कारण है ।

यदि आप <cmath> को शामिल करना भूल जाते हैं, तो आपके बजाय std::abs(my_float_num)हो सकता std::abs(int)है std::abs(float)। यह नोटिस करना मुश्किल है।


1

"एब्स" और "फैब्स" केवल C ++ फ्लोट प्रकारों के लिए समान हैं, जब उन्हें अस्पष्ट अधिभार संदेशों के बिना अनुवाद किया जा सकता है।

मैं g ++ (g ++ - 7) का उपयोग कर रहा हूं। टेम्पलेट के उपयोग के साथ साथ और विशेष रूप से जब mpreal का उपयोग करते हैं तो हार्ड "अस्पष्ट अधिभार" संदेशों के मामले होते हैं - abs(static_cast<T>(x))जो हमेशा हल नहीं होते हैं। जब एब्स अस्पष्ट होता है, तो संभावना है कि फ़ैब्स उम्मीद के मुताबिक काम कर रहे हैं। Sqrt के लिए मुझे ऐसा कोई सरल बच नहीं मिला।

सप्ताह के बाद से मैं सी ++ पर कठिन संघर्ष कर रहा हूं "मौजूदा समस्याएं नहीं"। मैं पहले से अधिक और बेहतर टेम्पलेट उपयोग के लिए C ++ 14 के लिए एक पुराने C ++ प्रोग्राम को अपडेट कर रहा हूं। अक्सर एक ही टेम्पलेट पैरामीटर वास्तविक किसी भी मानक फ्लोट या जटिल प्रकार या एक वर्ग प्रकार हो सकता है। कभी क्यों, लंबे डबल ने अन्य प्रकारों की तुलना में कुछ अधिक समझदार अभिनय किया। सभी काम कर रहे थे, और मैंने पहले भी एमप्रियल को शामिल किया था। तब मैं अपने डिफ़ॉल्ट फ्लोट प्रकार को mpreal सेट कर रहा था और सिंटैक्स त्रुटियों का एक जलप्रलय मिला। एब्स और स्क्वेयर के लिए हजारों अस्पष्ट ओवरलोड हैं, जो विभिन्न समाधानों के लिए रो रहे हैं। कुछ को ओवरलोड सहायता कार्यों की आवश्यकता थी, लेकिन एक टेम्पलेट के बाहर। जीरो या वन या एक टाइप_कास्ट का उपयोग करके सटीक निरंतर प्रकार के साथ व्यक्तिगत रूप से 0.0L और 1.0L के एक हजार usages को बदलना था - अस्पष्टता के कारण असंभव स्वचालित रूपांतरण परिभाषा।

मई तक मुझे निहित रूपांतरणों की मौजूदगी बहुत अच्छी लगी। लेकिन बहुत सरल यह किसी भी बिना होगा, और किसी अन्य मानक स्थिर प्रकार के लिए सुरक्षित स्पष्ट type_casts के साथ टाइपसेस्ट स्थिरांक होना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.