الدوال الرياضية C

العمليات الرياضية في لغة C هي مجموعة من الدوال في المكتبة القياسية للغة البرمجة C، تُنفّذ الدوال الرياضية الأساسية. [ 1 ] [ 2 ] توفر معايير C المختلفة مجموعات دوال مختلفة، وإن كانت متوافقة مع الإصدارات السابقة. تتوفر معظم هذه الدوال أيضًا في المكتبة القياسية للغة C++ ، ولكن في ملفات رأسية مختلفة (يتم تضمين ملفات رأس C أيضًا، ولكن فقط كميزة توافق مهملة).

نظرة عامة على الوظائف

تُعرَّف معظم الدوال الرياضية التي تستخدم الأعداد العشرية<math.h> في ملف الرأس ( <cmath>في لغة C++). أما الدوال التي تعمل على الأعداد الصحيحة ، مثل absو ، labsو div، و ldiv، فتُعرَّف في <stdlib.h>ملف الرأس ( <cstdlib>في لغة C++).

تستخدم جميع الدوال التي تعمل على الزوايا الراديان كوحدة قياس للزاوية. [ 1 ]

لا تتوفر جميع هذه الدوال في إصدار C89 من المعيار. أما الدوال المتوفرة، فهي تقبل فقط نوع البيانات doubleللوسائط ذات الفاصلة العائمة، مما يؤدي إلى تحويلات مكلفة للأنواع في التعليمات البرمجية التي تستخدم floatقيمًا أحادية الدقة. في C99، تم تدارك هذا القصور من خلال تقديم مجموعات جديدة من الدوال التي تعمل على الوسائط floatو long double. تُعرف هذه الدوال باللاحقتين fو lعلى التوالي. [ 3 ]

وظيفةوصف
abslabsllabsيحسب القيمة المطلقة لعدد صحيح
fabsيحسب القيمة المطلقة لقيمة عددية عشرية
divldivlldivيحسب ناتج وباقي قسمة الأعداد الصحيحة
fmodباقي عملية القسمة ذات الفاصلة العائمة
remainderتم توقيع ما تبقى من عملية القسم
remquoالباقي الموقّع بالإضافة إلى الأجزاء الثلاثة الأخيرة من عملية القسمة
fmaعملية الضرب والجمع المدمجة
fmaxالقيمة الأكبر من بين قيمتين عشريتين
fminأصغر قيمتين من قيم الفاصلة العائمة
fdimالفرق الموجب بين قيمتين عشريتين
nannanfnanlيُرجع قيمة NaN (ليس رقمًا)
الدوال الأسيةexpيعيد e مرفوعًا إلى القوة المعطاة
exp2يُرجع 2 مرفوعًا إلى القوة المعطاة
expm1يعيد e مرفوعًا إلى القوة المعطاة، ناقص واحد
logيحسب اللوغاريتم الطبيعي (للأساس e)
log2يحسب اللوغاريتم الثنائي (للأساس 2)
log10يحسب اللوغاريتم العشري (للأساس 10)
log1pيحسب اللوغاريتم الطبيعي (للأساس e) للعدد 1 زائد العدد المعطى
ilogbيستخرج أس العدد
logbيستخرج أس العدد
وظائف الطاقةsqrtيحسب الجذر التربيعي
cbrtيحسب الجذر التكعيبي
hypotيحسب الجذر التربيعي لمجموع مربعي عددين معطيين
powيرفع العدد إلى القوة المعطاة [ 4 ]
الدوال المثلثيةsinيحسب الجيب
cosيحسب جيب التمام
tanيحسب الظل
asinيحسب دالة الجيب العكسي
acosيحسب معكوس جيب التمام
atanيحسب ظل الزاوية العكسي
atan2يحسب ظل الزاوية العكسي، باستخدام الإشارات لتحديد الأرباع
الدوال الزائديةsinhيحسب الجيب الزائدي
coshيحسب جيب التمام الزائدي
tanhيحسب الظل الزائدي
asinhيحسب دالة الجيب العكسي الزائدي
acoshيحسب دالة جيب التمام العكسي الزائدي
atanhيحسب ظل الزاوية الزائدي
دوال الخطأ وجاماerfيحسب دالة الخطأ
erfcيحسب دالة الخطأ التكميلية
lgammaيحسب اللوغاريتم الطبيعي للقيمة المطلقة لدالة جاما
tgammaيحسب دالة جاما
عمليات الفاصلة العائمة لأقرب عدد صحيحceilتُرجع أقرب عدد صحيح لا يقل عن القيمة المُعطاة
floorتُرجع أقرب عدد صحيح لا يزيد عن القيمة المُعطاة
truncتُرجع أقرب عدد صحيح لا يزيد في قيمته عن القيمة المُعطاة
roundlroundllroundتُرجع أقرب عدد صحيح، مع التقريب بعيدًا عن الصفر في الحالات المتوسطة.
nearbyintتُعيد أقرب عدد صحيح باستخدام وضع التقريب الحالي
rintlrintllrintتُعيد هذه الدالة أقرب عدد صحيح باستخدام وضع التقريب الحالي، مع استثناء إذا كانت النتيجة مختلفة.
وظائف معالجة الأعداد العشريةfrexpيحلل العدد إلى جزء معنوي وقوة للعدد 2
ldexpيضرب عددًا في 2 مرفوعًا إلى قوة
modfيقوم بتحليل العدد إلى أجزاء صحيحة وكسرية
scalbnscalblnيضرب عددًا في FLT_RADIX مرفوعًا إلى قوة
nextafternexttowardتُعيد القيمة العشرية التالية القابلة للتمثيل باتجاه القيمة المُعطاة.
copysignينسخ إشارة قيمة الفاصلة العائمة
تصنيفfpclassifyيصنف قيمة الفاصلة العائمة المعطاة
isfiniteيتحقق مما إذا كانت قيمة الوسيط محدودة
isinfيتحقق مما إذا كانت الوسيطة لانهائية
isnanيتحقق مما إذا كانت القيمة المُدخلة NaN
isnormalيتحقق مما إذا كانت الوسيطة طبيعية
signbitيتحقق مما إذا كانت إشارة الوسيط سالبة

بيئة الفاصلة العائمة

تُضيف لغة C99 العديد من الدوال والأنواع للتحكم الدقيق في بيئة الأعداد العشرية. [ 3 ] يمكن استخدام هذه الدوال للتحكم في مجموعة متنوعة من الإعدادات التي تؤثر على حسابات الأعداد العشرية، على سبيل المثال، وضع التقريب، وشروط حدوث الاستثناءات، ومتى يتم تصفير الأرقام، وما إلى ذلك. يتم تعريف دوال وأنواع بيئة الأعداد العشرية في <fenv.h>ملف الرأس ( <cfenv>في لغة C++ ).

وظيفةوصف
feclearexceptيزيل الاستثناءات ( C99 )
fegetenvيخزن بيئة الفاصلة العائمة الحالية ( C99 )
fegetexceptflagيخزن علامات الحالة الحالية ( C99 )
fegetroundيسترجع اتجاه التقريب الحالي ( C99 )
feholdexceptيحفظ بيئة الفاصلة العائمة الحالية ويمسح جميع الاستثناءات ( C99 )
feraiseexceptيثير استثناءً في الفاصلة العائمة ( C99 )
fesetenvيحدد بيئة الفاصلة العائمة الحالية ( C99 )
fesetexceptflagيضبط علامات الحالة الحالية ( C99 )
fesetroundيحدد اتجاه التقريب الحالي ( C99 )
fetestexceptيختبر ما إذا كانت هناك استثناءات معينة قد تم طرحها ( C99 )
feupdateenvيعيد بيئة الفاصلة العائمة، لكنه يحتفظ بالاستثناءات الحالية ( C99 )

الأعداد المركبة

تُضيف لغة C99 كلمة مفتاحية جديدة _Complex( complexوماكرو مُيسّر؛ مُتاح فقط عند <complex.h>تضمين ملف الرأس) تُوفّر دعمًا للأعداد المركبة. يُمكن تعديل أي نوع بيانات ذي فاصلة عائمة باستخدام ` complex، ثم يُعرّف كزوج من الأعداد ذات الفاصلة العائمة. تجدر الإشارة إلى أن C99 وC++ لا تُنفّذان الأعداد المركبة بطريقة مُتوافقة مع الشيفرة البرمجية - إذ تُوفّر C++ بدلاً من ذلك الفئة ` .std::complex

تُعرَّف جميع العمليات على الأعداد المركبة في <complex.h>رأس الملف. وكما هو الحال مع الدوال ذات القيم الحقيقية، يشير اللاحق " fأو" إلى صيغة " أو" من الدالة.lfloat complexlong double complex

وظيفةوصف
العمليات الأساسيةcabsيحسب القيمة المطلقة ( C99 )
cargيحسب وسيط العدد المركب ( C99 )
cimagيحسب الجزء التخيلي من عدد مركب ( C99 )
crealيحسب الجزء الحقيقي من العدد المركب ( C99 )
conjيحسب المرافق المركب ( C99 )
cprojيحسب الإسقاط المركب في كرة ريمان ( C99 )
عمليات الأسسcexpيحسب الدالة الأسية المركبة ( C99 )
clogيحسب اللوغاريتم المركب ( C99 )
csqrtيحسب الجذر التربيعي المركب ( C99 )
cpowيحسب القوة المركبة ( C99 )
العمليات المثلثيةcsinيحسب الجيب المركب ( C99 )
ccosيحسب جيب التمام المركب ( C99 )
ctanيحسب الظل المركب ( C99 )
casinيحسب دالة الجيب العكسي المركب ( C99 )
cacosيحسب دالة جيب التمام العكسي المركب ( C99 )
catanيحسب ظل الزاوية المركب ( C99 )
العمليات الزائديةcsinhيحسب الجيب الزائدي المركب ( C99 )
ccoshيحسب جيب التمام الزائدي المركب ( C99 )
ctanhيحسب الظل الزائدي المركب ( C99 )
casinhيحسب دالة الجيب العكسي الزائدي المركب ( C99 )
cacoshيحسب جيب التمام العكسي الزائدي المركب ( C99 )
catanhيحسب ظل الزاوية الزائدية المعقدة ( C99 )

بعض الوظائف الأكثر تعقيدًا "محجوزة للاستخدام المستقبلي في C99". [ 5 ] يتم توفير التطبيقات من خلال مشاريع مفتوحة المصدر ليست جزءًا من المكتبة القياسية.

وظيفةوصف
دوال الخطأcerfيحسب دالة الخطأ المركبة ( C99 )
cerfcيحسب دالة الخطأ التكميلية المعقدة ( C99 )

الدوال العامة للأنواع

يُعرّف ملف الرأس <tgmath.h>ماكرو عامًا لكل دالة رياضية مُعرّفة في <math.h>و <complex.h>. يُضيف هذا دعمًا محدودًا لتحميل الدوال الرياضية بشكل زائد: يُمكن استخدام نفس اسم الدالة مع أنواع مختلفة من المعاملات؛ وسيتم اختيار الدالة الفعلية في وقت الترجمة وفقًا لأنواع المعاملات.

كل ماكرو عام للأنواع، يُقابل دالة مُعرَّفة للأعداد الحقيقية والمركبة، يُغلِّف ست دوال مختلفة: float، doubleو ، و long double، بالإضافة إلى complexمتغيراتها. أما الماكرو العام للأنواع، الذي يُقابل دالة مُعرَّفة للأعداد الحقيقية فقط، فيُغلِّف ثلاث دوال مختلفة: float، doubleو ، بالإضافة long doubleإلى متغيرات الدالة .

تتضمن لغة C++ دعمًا أصليًا لتحميل الدوال الزائد، وبالتالي فهي لا توفر <tgmath.h>ملف الرأس حتى كميزة توافق.

توليد الأرقام العشوائية

يُعرّف ملف الرأس <stdlib.h>( <cstdlib>في لغة C++) عدة دوال يمكن استخدامها لتوليد أرقام عشوائية إحصائياً. [ 6 ]

وظيفةوصف
randيقوم بتوليد رقم شبه عشوائي بين 0 و RAND_MAX، شاملاً.
srandيقوم بتهيئة مولد أرقام شبه عشوائية
arc4randomيُولّد رقمًا شبه عشوائي بين 0 و UINT32_MAX، عادةً باستخدام خوارزمية أفضل منrand
arc4random_uniformيقوم بتوليد رقم شبه عشوائي بين 0 وقيمة قصوى.
arc4random_bufاملأ المخزن المؤقت بتدفق بتات شبه عشوائي.
arc4random_stirيقوم بتهيئة مولد أرقام شبه عشوائية .

عائلة arc4randomدوال الأرقام العشوائية غير مُعرَّفة في معيار POSIX، ولكنها موجودة في بعض libcالتطبيقات الشائعة. كانت تُشير سابقًا إلى مُولِّد سلسلة المفاتيح لنسخة مُسرَّبة من تشفير RC4 (ومن هنا جاء مصطلح " RC4 المزعوم " ) ، ولكن تم تطبيق خوارزميات مختلفة، عادةً من تشفيرات أخرى مثل ChaCha20 ، باستخدام الاسم نفسه منذ ذلك الحين.

عادةً ما تكون جودة العشوائية الناتجة عن هذه الطريقة randضعيفة جدًا بحيث لا يمكن اعتبارها عشوائية إحصائيًا، وتتطلب تحديدًا دقيقًا للقيم الأولية. يُنصح عادةً باستخدام طريقة أخرى arc4randomبدلاً من randالطريقة الأولى كلما أمكن ذلك. بعض مكتبات لغة C تُنفذ randهذه الطريقة arc4random_uniformداخليًا.

وظائف خاصة

ابتداءً من C++17 ، أدخلت لغة C++ وظائف خاصة في <cmath>ملف الرأس.

وظيفةوصف
assoc_laguerreيحسب كثيرات الحدود لاجير المرتبطة
assoc_legendreيحسب كثيرات حدود ليجندر المرتبطة
betaيحسب دالة بيتا
comp_ellint_1يحسب التكامل الإهليلجي الكامل من النوع الأول
comp_ellint_2يحسب التكامل الإهليلجي الكامل من النوع الثاني
comp_ellint_3يحسب التكامل الإهليلجي الكامل من النوع الثالث
cyl_bessel_iيحسب دوال بيسل الأسطوانية المعدلة المنتظمة
cyl_bessel_jيحسب دوال بيسل الأسطوانية من النوع الأول
cyl_bessel_kيحسب دوال بيسل الأسطوانية المعدلة غير المنتظمة
cyl_neumannيحسب دوال نيومان الأسطوانية
ellint_1يحسب التكامل الإهليلجي غير الكامل من النوع الأول
ellint_2يحسب التكامل الإهليلجي غير الكامل من النوع الثاني
ellint_3يحسب التكامل الإهليلجي غير الكامل من النوع الثالث
expintيحسب التكامل الأسي
hermiteيحسب متعددات حدود هيرميت
legendreيحسب كثيرات حدود ليجندر
laguerreيحسب متعددات حدود لاغير
riemann_zetaيحسب دالة زيتا لريمان
sph_besselيحسب دوال بيسل الكروية من النوع الأول
sph_legendreيحسب دوال ليجندر الكروية المرتبطة
sph_neumannيحسب دوال نيومان الكروية

التطبيقات

في أنظمة POSIX مثل لينكس وبي إس دي<math.h> ، تُجمّع الدوال الرياضية (كما هو مُعلن عنها في ) بشكل منفصل في المكتبة الرياضية . لذلك، إذا استُخدمت أي من هذه الدوال، يجب توجيه الرابط إلى . توجد تطبيقات متنوعة، منها:libm-lmlibm

تشمل التطبيقات التي لا تندرج بالضرورة تحت اسم ما libmيلي:

انظر أيضاً

مراجع

  1. 1 2 مواصفات ISO/IEC 9899:1999 (PDF) . ص 212، § 7.12.
  2. براتا، ستيفن (2004). مقدمة في لغة C بلس . دار سامز للنشر. الملحق ب، القسم الخامس: مكتبة ANSI C القياسية مع إضافات C99. ISBN 0-672-32696-5.
  3. 1 2 براتا، ستيفن (2004). مقدمة في لغة C بلس . دار سامز للنشر. الملحق ب، القسم الثامن: تحسينات الحساب العددي C99. ISBN 0-672-32696-5.
  4. من الناحية الرمزية، قد يبدو استخدام pow( x , 2) أو pow( x , 3) لحساب المربعات أو المكعبات مناسبًا. مع ذلك، لا يُنصح بذلك في البرامج الحساسة للوقت. ما لم يُراعَ هذا الأسلوب هذه الحالات أثناء الترجمة، فإن x * x أو x * x * x سيُنفَّذ بشكل أسرع بكثير. كذلك،يُفضَّل استخدام sqrt( x ) و cbrt( x ) على pow( x , 0.5) أو pow( x , 1./3).
  5. man cerf(3), man cerfc(3), انظر على سبيل المثال https://linux.die.net/man/3/cerf .
  6. "مكتبة GNU C - ISO Random" . تم الاطلاع عليه بتاريخ 18 يوليو 2018 .
  7. "وظائف الرياضيات - مكتبة LLVM C" . libc.llvm.org .
  8. "RLibm: مكتبة RLibm المُقوَّمة بشكل صحيح من مختبر هندسة ولغات البرمجة بجامعة روتجرز" . people.cs.rutgers.edu .
  9. كوردس، بيتر. "إنتل - أين الدالة المضمنة '_mm256_pow_ps' في Clang؟" . ستاك أوفرفلو .