وظائف رياضية
| مكتبة سي القياسية (libc) |
|---|
| المواضيع العامة |
| عناوين متنوعة |
العمليات الحسابية في لغة سي هي مجموعة من الوظائف في المكتبة القياسية للغة البرمجة سي والتي تنفذ وظائف حسابية أساسية. [1] [2] تستخدم جميع الوظائف أرقامًا ذات فاصلة عائمة بطريقة أو بأخرى. توفر معايير سي المختلفة مجموعات مختلفة من الوظائف، وإن كانت متوافقة مع الإصدارات السابقة. تتوفر معظم هذه الوظائف أيضًا في مكتبة سي++ القياسية ، وإن كانت في رؤوس مختلفة (يتم تضمين رؤوس سي أيضًا، ولكن فقط كميزة توافقية قديمة).
نظرة عامة على الوظائف
يتم تعريف معظم الدوال الرياضية في <math.h>( <cmath>header في C++). الدوال التي تعمل على الأعداد الصحيحة، مثل abs، labs، div، و ldiv، يتم تعريفها بدلاً من ذلك في <stdlib.h>header ( <cstdlib>header في C++).
تستخدم أي وظيفة تعمل على الزوايا الراديان كوحدة للزاوية. [1]
لا تتوفر كل هذه الوظائف في إصدار C89 من المعيار. بالنسبة للوظائف المتاحة، تقبل الوظائف النوع فقط doubleلحجج الفاصلة العائمة، مما يؤدي إلى تحويلات مكلفة للنوع في الكود الذي يستخدم floatقيم الدقة المفردة. في C99، تم إصلاح هذا النقص من خلال تقديم مجموعات جديدة من الوظائف التي تعمل على floatو long doubleالحجج. يتم تحديد هذه الوظائف من خلال اللواحق fو على التوالي. [3]l
| وظيفة | وصف | |
|---|---|---|
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>header ( <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++ لا تنفذان الأعداد المركبة بطريقة متوافقة مع التعليمات البرمجية - حيث توفر الأخيرة بدلاً من ذلك الفئة .
std::complex
يتم تعريف جميع العمليات على الأعداد المركبة في <complex.h>العنوان. وكما هو الحال مع الدوال ذات القيمة الحقيقية، فإن اللاحقة fأو lتشير إلى متغير float complexأو long double complexالدالة.
| وظيفة | وصف | |
|---|---|---|
العمليات الأساسية |
cabs
|
يحسب القيمة المطلقة ( C99 ) |
carg
|
يحسب وسيطة عدد مركب ( C99 ) | |
cimag
|
يحسب الجزء التخيلي من عدد مركب ( C99 ) | |
creal
|
يحسب الجزء الحقيقي من عدد مركب ( C99 ) | |
| يحسب المترافق المعقد ( 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>. وهذا يضيف دعمًا محدودًا للتحميل الزائد للدالة الرياضية: يمكن استخدام نفس اسم الدالة مع أنواع مختلفة من المعلمات؛ وسيتم تحديد الدالة الفعلية في وقت التجميع وفقًا لأنواع المعلمات.
كل ماكرو عام من النوع يتوافق مع دالة محددة لكل من الأعداد الحقيقية والمركبة يغلف ما مجموعه 6 دوال مختلفة: floatو doubleو long doubleو complexومتغيراتها. وحدات الماكرو العامة من النوع التي تتوافق مع دالة محددة للأعداد الحقيقية فقط تغلف ما مجموعه 3 دوال مختلفة: 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داخليًا.
التنفيذات
في أنظمة POSIX مثل Linux و BSD ، يتم تجميع الوظائف الرياضية (كما هو معلن في <math.h>) بشكل منفصل في المكتبة الرياضية . لذلك، إذا تم استخدام أي من هذه الوظائف، فيجب إعطاء الرابط التوجيه . هناك تنفيذات مختلفة، بما في ذلك:
libm-lmlibm
- libm من GNU libc
- تستخدم AMD libm، github، تقريبًا كما تستخدمها Windows
- مكتبة مُجمِّع Intel C++
- مكتبة Red Hat (Newlib)
- FDLIBM الخاص بشركة Sun ، والذي تم استخدامه كأساس لـ msun الخاص بشركة FreeBSD وlibm الخاص بشركة OpenBSD ، وكلاهما بدورهما كانا أساسًا لـ OpenLibm الخاص بشركة Julia
- مكتبة Musl ، المستندة إلى BSD
libmsومشاريع أخرى مثل Arm - libm الخاص بـ LLVM ، والذي تم تقريبه بشكل صحيح (أي أن الأخطاء من النتيجة الصحيحة رياضيًا أقل من 0.5 وحدة في المكان الأخير ) [7]
- مشروع Arénaire، CRlibm (libm المستديرة بشكل صحيح)، وخليفته MetaLibm، والذي يستخدم خوارزمية Remez لتوليد تقريبات مثبتة رسميًا تلقائيًا.
- Rutger's RLIBM، الذي يوفر وظائف مدورة بشكل صحيح بدقة واحدة. [8]
تتضمن التنفيذات التي لا تكون بالضرورة تحت اسم libmما يلي:
- روتينات الرياضيات المحسنة لـ Arm
- GCE-Math هي نسخة من وظائف الرياضيات C/C++ المكتوبة لـ C++
constexpr(حساب وقت التجميع) - CORE-MATH، تقريب صحيح للدقة المفردة والمزدوجة.
- تتضمن مكتبات الرياضيات SIMD (المتجهة) SLEEF وYeppp! وVCL الخاصة بـ Agner Fog ، بالإضافة إلى بعض المكتبات المغلقة المصدر مثل SVML وDirectXMath. [9]
انظر أيضا
مراجع
- ^ من مواصفات ISO/IEC 9899:1999 (PDF) . ص 212، الفقرة 7.12.
- ^ Prata, Stephen (2004). C primer plus . Sams Publishing. Appendix B, Section V: The Standard ANSI C Library with C99 Additions. ISBN 0-672-32696-5.
- ^ ab Prata, Stephen (2004). C primer plus . Sams Publishing. Appendix B, Section VIII: C99 Numeric Computational Enhancements. ISBN 0-672-32696-5.
- ^ من الناحية النحوية، قد يبدو من الملائم استخدام pow( x ,2) أو pow( x ,3) لحساب المربعات أو المكعبات. ومع ذلك، لا يُنصح بذلك في التعليمات البرمجية ذات الأهمية الزمنية. ما لم يعتني التنفيذ بهذه الحالات بشكل خاص في وقت التجميع، فسوف يتم تنفيذ x * x أو x * x * x بشكل أسرع كثيرًا. أيضًا، يجب تفضيل sqrt( x ) و cbrt( x ) على pow( x ,.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: مكتبة Rutgers Architecture and Programming Languages Lab's Correctly Rounded Libm". people.cs.rutgers.edu .
- ^ كورديس، بيتر. "intel - أين هو '_mm256_pow_ps' الجوهري لـ Clang؟". Stack Overflow .
روابط خارجية
- :التصريحات الرياضية – مرجع تعريفات القاعدة، مواصفات UNIX الفردية ، الإصدار 4 من مجموعة Open Group
- مرجع لغة سي للوظائف الرياضية
