الدوال الرياضية 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>ملف الرأس.
التطبيقات
في أنظمة POSIX مثل لينكس وبي إس دي<math.h> ، تُجمّع الدوال الرياضية (كما هو مُعلن عنها في ) بشكل منفصل في المكتبة الرياضية . لذلك، إذا استُخدمت أي من هذه الدوال، يجب توجيه الرابط إلى . توجد تطبيقات متنوعة، منها:libm-lmlibm
- مكتبة GNU libc 's libm
- مكتبة libm الخاصة بشركة AMD ، الموجودة على موقع GitHub ، تُستخدم تقريبًا كما هي بواسطة نظام التشغيل Windows
- مكتبة Intel C++ Compiler libm
- مكتبة Red Hat libm (Newlib)
- مكتبة FDLIBM الخاصة بنظام Sun ، والتي استُخدمت كأساس لمكتبة msun الخاصة بنظام FreeBSD ومكتبة libm الخاصة بنظام OpenBSD ، وكلاهما بدوره كان أساس مكتبة OpenLibm الخاصة بلغة Julia.
- مكتبة musl libm ، المستندة إلى BSD
libmومشاريع أخرى مثل Arm - مكتبة LLVM libm، والتي يتم تقريبها بشكل صحيح (أي أن الأخطاء الناتجة عن النتيجة الصحيحة رياضيا أقل من 0.5 وحدة في الخانة الأخيرة ) [ 7 ]
- CRlibm (مكتبة التقريب الصحيح) لمشروع Arénaire ، وخليفتها MetaLibm ، التي تستخدم خوارزمية Remez لتوليد تقريبات مثبتة رسميًا تلقائيًا.
- RLIBM من جامعة روتجر، والذي يوفر دوالًا مقربة بشكل صحيح بدقة مفردة. [ 8 ]
تشمل التطبيقات التي لا تندرج بالضرورة تحت اسم ما libmيلي:
- إجراءات الرياضيات المُحسّنة من Arm
- GCE-Math هي نسخة من دوال الرياضيات C/C++ مكتوبة بلغة C++
constexpr(حساب وقت الترجمة). - CORE-MATH ، مع تقريب صحيح للدقة المفردة والمزدوجة.
- تتضمن مكتبات الرياضيات SIMD (المتجهة) SLEEF و Yeppp! (مؤرشفة في 14 يوليو 2020 على Wayback Machine ) و VCL الخاصة بـ Agner Fog ، بالإضافة إلى بعض المكتبات المغلقة المصدر مثل SVML و DirectXMath. [ 9 ]
انظر أيضاً
مراجع
- 1 2 مواصفات ISO/IEC 9899:1999 (PDF) . ص 212، § 7.12.
- ↑ براتا، ستيفن (2004). مقدمة في لغة C بلس . دار سامز للنشر. الملحق ب، القسم الخامس: مكتبة ANSI C القياسية مع إضافات C99. ISBN 0-672-32696-5.
- 1 2 براتا، ستيفن (2004). مقدمة في لغة C بلس . دار سامز للنشر. الملحق ب، القسم الثامن: تحسينات الحساب العددي C99. ISBN 0-672-32696-5.
- ↑ من الناحية الرمزية، قد يبدو استخدام pow( x , 2) أو pow( x , 3) لحساب المربعات أو المكعبات مناسبًا. مع ذلك، لا يُنصح بذلك في البرامج الحساسة للوقت. ما لم يُراعَ هذا الأسلوب هذه الحالات أثناء الترجمة، فإن x * x أو x * x * x سيُنفَّذ بشكل أسرع بكثير. كذلك،يُفضَّل استخدام sqrt( x ) و cbrt( x ) على pow( x , 0.5) أو pow( x , 1./3).
- ↑ man cerf(3), man cerfc(3), انظر على سبيل المثال https://linux.die.net/man/3/cerf .
- ↑ "مكتبة GNU C - ISO Random" . تم الاطلاع عليه بتاريخ 18 يوليو 2018 .
- ↑ "وظائف الرياضيات - مكتبة LLVM C" . libc.llvm.org .
- ↑ "RLibm: مكتبة RLibm المُقوَّمة بشكل صحيح من مختبر هندسة ولغات البرمجة بجامعة روتجرز" . people.cs.rutgers.edu .
- ↑ كوردس، بيتر. "إنتل - أين الدالة المضمنة '_mm256_pow_ps' في Clang؟" . ستاك أوفرفلو .
روابط خارجية
- : التصريحات الرياضية – مرجع تعريفات الأساس، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Group
- مرجع لغة C للدوال الرياضية
- مكتبة C القياسية
