আমি ধরে নিই abs
এবং fabs
ব্যবহার করার সময় ভিন্ন আচরণ করছি math.h
। তবে আমি যখন ন্যায়সঙ্গত cmath
এবং ব্যবহার করি তখন std::abs
কি আমাকে ব্যবহার করতে হবে std::fabs
বা fabs
? বা এটি সংজ্ঞায়িত করা হয় না?
উত্তর:
সি ++ এ, এটি সর্বদা ব্যবহারের জন্য যথেষ্ট std::abs
; এটি সমস্ত সংখ্যার জন্য ওভারলোড।
সি- abs
তে কেবলমাত্র পূর্ণসংখ্যার উপর কাজ করে এবং আপনার fabs
ভাসমান পয়েন্টের মান প্রয়োজন। এগুলি সি ++ এ উপলব্ধ রয়েছে (সমস্ত সি লাইব্রেরির সাথে) তবে এগুলি ব্যবহার করার দরকার নেই।
int
C লাইব্রেরি থেকে সংস্করণ, সেখানে overloads হয় long
, float
, double
এবং long double
। ধারা ২.2.২.। এর জন্য একটি ওভারলোডও সংজ্ঞায়িত করে complex
।
std::
এবং কেবল ব্যবহার করেন তবে abs
আপনার কোডটি উইন্ডোতে প্রত্যাশার মতো কাজ করবে তবে int
লিনাক্সের সংস্করণটি ব্যবহার করবে , যা ডিবাগ করা অবিশ্বাস্যরকম শক্ত হতে পারে।
এটি যুক্তি এবং তর্কগুলি ব্যবহার করার fabs
জন্য এখনও ঠিক আছে । আমি এটি পছন্দ করি কারণ এটি নিশ্চিত করে যে আমি যদি ভুলক্রমে দুর্ঘটনাটি বন্ধ করি তবে ভাসমান পয়েন্ট ইনপুটগুলির জন্য আচরণটি একই থাকে।double
float
std::
abs
abs
পরিবর্তে ব্যবহারের নিজের ভুলের কারণে আমি এই সমস্যাটি ডিবাগ করার জন্য কেবল 10 মিনিট ব্যয় করেছি 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)
"অ্যাবস" এবং "ফ্যাবস" কেবল সি ++ ফ্ল্যাট প্রকারের জন্যই অভিন্ন, যখন এগুলি অস্পষ্ট ওভারলোড বার্তা ছাড়াই অনুবাদ করা যায়।
আমি জি ++ (জি ++ - 7) ব্যবহার করছি। একসাথে টেমপ্লেট ব্যবহারের সাথে এবং বিশেষত ম্রিপাল ব্যবহার করার সময় কঠোর "দ্ব্যর্থহীন ওভারলোড" বার্তাগুলির ক্ষেত্রে রয়েছে - abs(static_cast<T>(x))
সর্বদা এটি সমাধান করে না। যখন অ্যাবস অস্পষ্ট থাকে তখন সম্ভাবনা থাকে যে কল্পিত প্রত্যাশা অনুযায়ী কাজ করছে। স্কয়ার্টের জন্য আমি এর চেয়ে সহজ কোনও পালাতে পেলাম না।
কয়েক সপ্তাহ ধরে আমি C ++ "বিদ্যমান সমস্যা নয়" নিয়ে কঠোর সংগ্রাম করছি। আমি আগের চেয়ে আরও বেশি ভাল এবং আরও ভাল টেম্পলেট ব্যবহারের জন্য সি ++ 14 তে একটি পুরানো সি ++ প্রোগ্রাম আপডেট করছি। প্রায়শই একই টেম্পলেট প্যারামিটারটি কোনও মানক ফ্লোট বা জটিল ধরণের বা শ্রেণীর ধরণের প্রকৃত হতে পারে। কেন কখনও, দীর্ঘ ডাবল অন্য ধরণের চেয়ে কিছুটা বেশি বুদ্ধিমানের অভিনয় করেছিল। সব কাজ করছিল, এবং আমি আগে ম্রিপাল অন্তর্ভুক্ত ছিল। তারপরে আমি আমার ডিফল্ট ফ্লোট টাইপকে ম্রিপালে সেট করছিলাম এবং সিনট্যাক্স ত্রুটির একটি প্রলয় পেলাম। এটি হাজার হাজার অস্পষ্ট ওভারলোড দিয়েছে যেমন অ্যাবস এবং স্কয়ার্টের জন্য, বিভিন্ন সমাধানের জন্য কাঁদছে। কারও কারও কাছে ওভারলোড হওয়া সহায়তা ফাংশনগুলির প্রয়োজন ছিল, তবে কোনও টেম্পলেটটির বাইরে of জিরো বা ওয়ান বা একটি টাইপকাস্ট ব্যবহার করে সঠিক ধ্রুবক ধরণের সাথে পৃথকভাবে 0.0L এবং 1.0L এর এক হাজার ব্যবহারের প্রতিস্থাপন করতে হবে - অস্পষ্টতার কারণে স্বয়ংক্রিয় রূপান্তর সংজ্ঞা অসম্ভব।
আপাতত আমি অন্তর্নিহিত রূপান্তরগুলির বিদ্যমানটি খুব সুন্দর পেয়েছি। তবে এটি কোনও সহজ ছাড়াই সহজ এবং অন্য যে কোনও স্ট্যান্ডার্ড ধ্রুবক প্রকারে নিরাপদ স্পষ্টত টাইপ_কাস্টসের সাথে টাইপসেভ ধ্রুবক রয়েছে।