2010-06-25 21 views
81

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

उत्तर

105

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

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

+0

क्या यह हर मंच पर मामला है? Esp। विंडोज और मैक ओएस एक्स? या कम से कम सी ++ मानक में है? – math

+2

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

+1

यह सी ++ मानक में है, इसलिए विंडोज और मैक ओएस एक्स सहित एक सभ्य कंपाइलर के साथ हर प्लेटफ़ॉर्म पर यह मामला है। खंड 26.5 का कहना है कि, सी लाइब्रेरी से 'int' संस्करण के अलावा,' लंबे समय तक ओवरलोड ', 'फ्लोट', 'डबल' और 'लम्बा डबल'। खंड 26.2.7 'जटिल' के लिए एक अधिभार भी परिभाषित करता है। –

21

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

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

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

+2

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

+0

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

+0

एंड्रॉइड एनडीके जी ++ से सावधान रहें, यह std :: abs() के बजाय c abs() फ़ंक्शन को भी cedes। विजुअल स्टूडियो सी ++ कंपाइलर में हालांकि पेट हमेशा std :: abs() को इंगित करता है। – southerton

7

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

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

1

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

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

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

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

संबंधित मुद्दे