C++17 با افزودن مجموعهای از توابع و الگوریتمهای عددی جدید در هدر <numeric>، گام بزرگی در جهت استانداردسازی محاسبات رایج ریاضی برداشت. این توابع که برخی از آنها پیشتر در کتابخانههای دیگر مانند Boost
موجود بودند، اکنون بهعنوان بخشی از هستهی زبان در دسترس قرار گرفتهاند
و نیاز به پیادهسازی دستی الگوریتمهای پرکاربرد را از بین بردهاند. این
پیشرفت، کدنویسی را سادهتر و قابلاطمینانتر میسازد و به برنامهنویسان
اجازه میدهد تا بر روی منطق اصلی برنامه خود تمرکز کنند، نه بر روی
پیادهسازی مجدد محاسبات پایهای.
ب.م.م و ک.م.م: دو تابع بنیادین
دو تابع std::gcd و std::lcm که در هدر <numeric>
تعریف شدهاند، بهترتیب بزرگترین مقسومعلیه مشترک و کوچکترین مضرب
مشترک دو عدد صحیح را محاسبه میکنند. این توابع از C++17 بهصورت
استاندارد در دسترس هستند و با دریافت دو عدد از نوعهای صحیح (Integer
Types)، نتیجه را بهصورت std::common_type_t از آن دو عدد بازمیگردانند. یکی از ویژگیهای مهم این توابع، ثابتبودن در زمان کامپایل (constexpr) است که امکان استفاده از آنها را در محاسبات زمان کامپایل فراهم میکند. همچنین این توابع هیچ استثنایی پرتاب نمیکنند و برای حالت خاصی که هر دو عدد صفر باشند، مقدار صفر را بازمیگردانند.
نکات کاربردی مهم
بر اساس مستندات استاندارد، استفاده از این توابع با نوعهای غیرصحیح یا bool
منجر به برنامهای ناسالم (Ill-Formed) میشود. همچنین اگر مقدار مطلق هر
یک از اعداد یا نتیجهی محاسبه قابل نمایش در نوع خروجی نباشد، رفتار
برنامه تعریفنشده خواهد بود. برای تشخیص وجود این توابع در کامپایلر،
میتوان از ماکروی ویژگی __cpp_lib_gcd_lcm استفاده کرد که در استاندارد C++17 مقدار 201606L
را دارد. در عمل، بسیاری از پروژهها که پیشتر الگوریتمهای ب.م.م و
ک.م.م را بهصورت دستی پیادهسازی میکردند، اکنون از این توابع استاندارد
بهره میبرند و به توصیهی متخصصان، دیگر پیادهسازی دستی این توابع توصیه
نمیشود، زیرا هم کندتر است و هم مستعد خطا.
توابع ویژهی ریاضی در C++17
علاوه بر توابع عاملهای عددی، C++17 مجموعهی وسیعی از توابع ویژهی ریاضی (Mathematical Special Functions) را نیز به هدر <cmath>
اضافه کرده است. این توابع که در اصل بخشی از استانداردهای پیشین مانند
TR1 و ISO/IEC 29124:2010 بودند، اکنون بهعنوان بخشی از استاندارد اصلی
C++17 پذیرفته شدهاند. این مجموعه شامل توابع پیشرفتهای مانند توابع بسل
(Bessel Functions)، توابع بتا (Beta Function)، توابع زتای ریمان (Riemann
Zeta Function)، چندجملهایهای لژاندر و هرایت (Legendre and Hermite
Polynomials) و توابع انتگرالگیری بیضوی (Elliptic Integrals) میشود.
وجود این توابع در کتابخانهی استاندارد، C++ را به ابزاری قدرتمند برای
محاسبات علمی، مهندسی و مالی تبدیل کرده است.
الگوریتمهای کاهش و تجمیع پیشرفته
C++17 همچنین الگوریتمهای جدیدی برای تجمیع و کاهش عناصر یک محدوده معرفی کرده است. تابع std::reduce که در هدر <numeric> تعریف شده، مشابه std::accumulate عمل میکند، اما با این تفاوت که ترتیب اعمال عملیات را مشخص نمیکند
و بنابراین میتواند بهصورت موازی یا نامرتب اجرا شود. این ویژگی به
کامپایلر اجازه میدهد تا عملیات را برای بهینهسازی عملکرد، بازآرایی کند.
با این حال، بهدلیل همین نامشخصبودن ترتیب، std::reduce تنها برای عملگرهای انجمنی (Associative) و جابهجاییپذیر
(Commutative) مانند جمع اعداد صحیح قابل استفاده است و برای اعداد ممیز
شناور که جمع آنها دقیقاً انجمنی نیست، باید با دقت بیشتری به کار رود.
سایر الگوریتمهای عددی
در کنار توابع یادشده، C++17 الگوریتمهای مفید دیگری مانند std::clamp را نیز معرفی کرده است که یک مقدار را در یک بازهی مشخص محدود میکند و std::sample که نمونهگیری تصادفی از یک محدوده را انجام میدهد. همچنین توابع std::inclusive_scan و std::exclusive_scan برای محاسبهی پیشوندهای یک دنباله با امکان اعمال عملگرهای دلخواه، در دسترس هستند. این ابزارها که در هدر <algorithm> و <numeric>
قرار دارند، مجموعهی کاملی از امکانات را برای برنامهنویسی عددی و عمومی
در C++17 فراهم میکنند و نیاز به کتابخانههای خارجی را در بسیاری از
موارد برطرف میسازند.
کلیدواژه ها : std::gcd-std::lcm-بزرگترین مقسوم علیه مشترک در C++-کمترین مضرب مشترک در C++-توابع ریاضی C++17-mathematical special functions C++17-std::reduce-std::clamp-std::sample-الگوریتمهای عددی C++17-هدر numeric در C++-توابع بسل در C++-چندجملهای لژاندر C++-std::inclusive_scan-std::exclusive_scan-محاسبات زمان کامپایل در C++-__cpp_lib_gcd_lcm-بهبود کتابخانه عددی C++17-آموزش std::gcd-آموزش std::lcm