আমি কবে কল্পবিচ্ছিন্ন ব্যবহার করব এবং কখন এসটিডি :: অ্যাবস ব্যবহারের জন্য যথেষ্ট?


100

আমি ধরে নিই absএবং fabsব্যবহার করার সময় ভিন্ন আচরণ করছি math.h। তবে আমি যখন ন্যায়সঙ্গত cmathএবং ব্যবহার করি তখন std::absকি আমাকে ব্যবহার করতে হবে std::fabsবা fabs? বা এটি সংজ্ঞায়িত করা হয় না?

উত্তর:


124

সি ++ এ, এটি সর্বদা ব্যবহারের জন্য যথেষ্ট std::abs; এটি সমস্ত সংখ্যার জন্য ওভারলোড।

সি- absতে কেবলমাত্র পূর্ণসংখ্যার উপর কাজ করে এবং আপনার fabsভাসমান পয়েন্টের মান প্রয়োজন। এগুলি সি ++ এ উপলব্ধ রয়েছে (সমস্ত সি লাইব্রেরির সাথে) তবে এগুলি ব্যবহার করার দরকার নেই।


এটি কি প্রতিটি প্ল্যাটফর্মের ক্ষেত্রে? এসপি উইন্ডোজ এবং ম্যাক ওএস এক্স? নাকি এটি কমপক্ষে সি ++ স্ট্যান্ডার্ডে রয়েছে?
গণিত

4
@ ব্রুবেলসবস: হ্যাঁ সি ++ এ ফাংশন ওভারলোডিং (অ্যাবস অসংখ্য ধরণের জন্য সংজ্ঞায়িত করা যেতে পারে এবং এটি সি ++ এর মধ্যে) থেকে আলাদা আলাদা কৃত্রিম ফাংশনের প্রয়োজন নেই। এটি স্ট্যান্ডার্ড দ্বারাও গ্যারান্টিযুক্ত। অবশ্যই আপনি যদি খনন করে 10 বছরেরও বেশি পুরানো সংকলকটি খুঁজে পান তবে আপনি এমন কোনওটি খুঁজে পেতে পারেন যা এটি সমর্থন করে না।
stinky472

4
এটা তোলে সি ++ স্ট্যান্ডার্ড আছে, তাই এটি Windows ও Mac OS এক্স ধারা 26.5 সহ একটি শালীন কম্পাইলার, প্রতিটি প্ল্যাটফর্মের উপর ক্ষেত্রে যে বলছেন, ছাড়াও intC লাইব্রেরি থেকে সংস্করণ, সেখানে overloads হয় long, float, doubleএবং long double। ধারা ২.2.২.। এর জন্য একটি ওভারলোডও সংজ্ঞায়িত করে complex
মাইক সিমুর

6
আপনি যদি ভুলে যান std::এবং কেবল ব্যবহার করেন তবে absআপনার কোডটি উইন্ডোতে প্রত্যাশার মতো কাজ করবে তবে intলিনাক্সের সংস্করণটি ব্যবহার করবে , যা ডিবাগ করা অবিশ্বাস্যরকম শক্ত হতে পারে।
অ্যাডভারস

" সমস্ত সংখ্যার প্রকার" [উদ্ধৃতি আবশ্যক]] আমি ইনটি, লম্বা, দীর্ঘ দীর্ঘ, স্টাডি :: ইনটম্যাক্স_টি, ফ্লোট, ডবল, লম্বা ডাবল দেখতে পাচ্ছি। আমি দেখতে পাচ্ছি এমন কোনও সংক্ষিপ্ত বা চর সংস্করণ (বা স্বাক্ষরযুক্ত সংস্করণ) নেই।
ব্যবহারকারী 673679

23

এটি যুক্তি এবং তর্কগুলি ব্যবহার করার fabsজন্য এখনও ঠিক আছে । আমি এটি পছন্দ করি কারণ এটি নিশ্চিত করে যে আমি যদি ভুলক্রমে দুর্ঘটনাটি বন্ধ করি তবে ভাসমান পয়েন্ট ইনপুটগুলির জন্য আচরণটি একই থাকে।doublefloatstd::abs

absপরিবর্তে ব্যবহারের নিজের ভুলের কারণে আমি এই সমস্যাটি ডিবাগ করার জন্য কেবল 10 মিনিট ব্যয় করেছি std::abs। আমি ধরে নিয়েছি যে using namespace std;অনুমান করা হবে std::absতবে তা হয়নি এবং পরিবর্তে সি সংস্করণটি ব্যবহার করছিলাম ।

যাইহোক, আমি বিশ্বাস করি স্পষ্টত আপনার উদ্দেশ্যটিকে দলিল করার উপায় হিসাবে ভাসমান-পয়েন্ট ইনপুটগুলির fabsপরিবর্তে ব্যবহার করা ভাল abs


4
এটা বিরক্তিকর. আপনার কলটি অস্পষ্ট হওয়া উচিত (এবং এইভাবে একটি ত্রুটি)?
নিক

আপনার কি ভাসা-ভাসার জন্য ফেবসফ ব্যবহার করা উচিত নয়? সুতরাং আমি সেগুলি অভিন্ন বলে মনে করি না।
নিক

অ্যান্ড্রয়েড এনডিকে জি ++ থেকে সাবধান থাকুন, এটি স্টাড :: অ্যাবস () এর পরিবর্তে সি এবস () ফাংশনে সিড করে। ভিজ্যুয়াল স্টুডিও সি ++ কম্পাইলারে তবে এ্যাবস সবসময়ই স্ট্যান্ড :: অ্যাবস () এর দিকে নির্দেশ করে।
সাউদারটন

@ নিক, আমি মনে করি আমি আপনার সাথে একমত: আমার কাছে অ্যালান টিউরিংয়ের আচরণটি মনে হচ্ছে না, যেমন আমার কাছে ওভারলোড হওয়া std::absসর্বদা আহ্বান করা হয় (এবং এর সি-সংস্করণ নয় abs) কল করা absহয় যতক্ষণ না using namespace std;সেখানে বর্ণিত হয়েছে শুরু যদিও এটি সংকলক নির্দিষ্ট কিনা তা আমি জানি না।
মবিপ্রণভ

@ নিক কোনও ত্রুটি নয় কারণ এখানে কোনও ফাংশনের নাম মেলে। এটি কোনটি নির্বাচিত হবে তা নির্ধারণ করা হয়।
প্যাটো সান্দাস

11

std::fabsসুস্পষ্টভাবে ভাসমান-পয়েন্ট ইনপুটগুলির জন্য সুপারিশ করার আরও একটি কারণ রয়েছে ।

আপনি যদি <cmath> অন্তর্ভুক্ত করতে ভুলে যান তবে আপনার পরিবর্তে এটি std::abs(my_float_num)হতে পারে । এটা লক্ষ্য করা কঠিন।std::abs(int)std::abs(float)


1

"অ্যাবস" এবং "ফ্যাবস" কেবল সি ++ ফ্ল্যাট প্রকারের জন্যই অভিন্ন, যখন এগুলি অস্পষ্ট ওভারলোড বার্তা ছাড়াই অনুবাদ করা যায়।

আমি জি ++ (জি ++ - 7) ব্যবহার করছি। একসাথে টেমপ্লেট ব্যবহারের সাথে এবং বিশেষত ম্রিপাল ব্যবহার করার সময় কঠোর "দ্ব্যর্থহীন ওভারলোড" বার্তাগুলির ক্ষেত্রে রয়েছে - abs(static_cast<T>(x))সর্বদা এটি সমাধান করে না। যখন অ্যাবস অস্পষ্ট থাকে তখন সম্ভাবনা থাকে যে কল্পিত প্রত্যাশা অনুযায়ী কাজ করছে। স্কয়ার্টের জন্য আমি এর চেয়ে সহজ কোনও পালাতে পেলাম না।

কয়েক সপ্তাহ ধরে আমি C ++ "বিদ্যমান সমস্যা নয়" নিয়ে কঠোর সংগ্রাম করছি। আমি আগের চেয়ে আরও বেশি ভাল এবং আরও ভাল টেম্পলেট ব্যবহারের জন্য সি ++ 14 তে একটি পুরানো সি ++ প্রোগ্রাম আপডেট করছি। প্রায়শই একই টেম্পলেট প্যারামিটারটি কোনও মানক ফ্লোট বা জটিল ধরণের বা শ্রেণীর ধরণের প্রকৃত হতে পারে। কেন কখনও, দীর্ঘ ডাবল অন্য ধরণের চেয়ে কিছুটা বেশি বুদ্ধিমানের অভিনয় করেছিল। সব কাজ করছিল, এবং আমি আগে ম্রিপাল অন্তর্ভুক্ত ছিল। তারপরে আমি আমার ডিফল্ট ফ্লোট টাইপকে ম্রিপালে সেট করছিলাম এবং সিনট্যাক্স ত্রুটির একটি প্রলয় পেলাম। এটি হাজার হাজার অস্পষ্ট ওভারলোড দিয়েছে যেমন অ্যাবস এবং স্কয়ার্টের জন্য, বিভিন্ন সমাধানের জন্য কাঁদছে। কারও কারও কাছে ওভারলোড হওয়া সহায়তা ফাংশনগুলির প্রয়োজন ছিল, তবে কোনও টেম্পলেটটির বাইরে of জিরো বা ওয়ান বা একটি টাইপকাস্ট ব্যবহার করে সঠিক ধ্রুবক ধরণের সাথে পৃথকভাবে 0.0L এবং 1.0L এর এক হাজার ব্যবহারের প্রতিস্থাপন করতে হবে - অস্পষ্টতার কারণে স্বয়ংক্রিয় রূপান্তর সংজ্ঞা অসম্ভব।

আপাতত আমি অন্তর্নিহিত রূপান্তরগুলির বিদ্যমানটি খুব সুন্দর পেয়েছি। তবে এটি কোনও সহজ ছাড়াই সহজ এবং অন্য যে কোনও স্ট্যান্ডার্ড ধ্রুবক প্রকারে নিরাপদ স্পষ্টত টাইপ_কাস্টসের সাথে টাইপসেভ ধ্রুবক রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.