اذهب إلى المحتوى

القيم الحدية والدوال الرياضية في لغة سي C


Naser Dakhel

نتطرق في هذا المقال إلى كل من ملفات الترويسة الخاصة بالقيم الحدّية Limits والدوال الرياضية في لغة C، كما نقدّم شرحًا موجزًا عن الأسماء المعرفة بداخل كل من الملفات، ويمكنك الاحتفاظ بهذا القسم كمرجع سريع بخصوص هذا الأمر.

القيم الحدية

يعرّف ملفا الترويسة <float.h> و <limits.h> عدة قيم حدية معرفة حسب التطبيق.

ملف الترويسة <limits.h>

يوضح الجدول 1 الأسماء المُصرح عنها في هذا الملف وقيمها المسموحة، إضافةً إلى وصف موجز عن وظيفتها، إذ يوضح وصف SHRT_MIN مثلًا أن قيمة الاسم في بعض التطبيقات يجب أن تكون أقل من أو تساوي القيمة ‎-32767، وهذا يعني أن البرنامج لا يستطيع الاعتماد على متغيرات صغيرة short لتخزين قيم سالبة تتعدى 32767- إذا أردنا قابلية نقل أكبر للبرنامج. قد يدعم التطبيق في بعض الأحيان القيم السالبة الأكبر إلا أن الحد الأدنى الذي يجب أن يدعمه التطبيق هو 32767-.

الاسم القيم المسموحة الوصف
CHAR_BIT (≥8) بتات في قيمة من نوع char
CHAR_MAX اقرأ الملاحظة القيمة العظمى لنوع char
CHAR_MIN اقرأ الملاحظة القيمة الدنيا لنوع char
INT_MAX (≥‎+32767) القيمة العظمى لنوع int
INT_MIN (≤‎−32767) القيمة الدنيا لنوع int
LONG_MAX (≥‎+2147483647) القيمة العظمى لنوع long
LONG_MIN (≤‎−2147483647) القيمة الدنيا لنوع long
MB_LEN_MAX (≥1) عدد البتات الأعظمي في محرف متعدد البتات multibyte character
SCHAR_MAX (≥‎+127) القيمة العظمى لنوع signed char
SCHAR_MIN (≤‎−127) القيمة الدنيا لنوع signed char
SHRT_MAX (≥‎+32767) القيمة العظمى لنوع short
SHRT_MIN (≤‎−32767) القيمة الدنيا لنوع short
UCHAR_MAX (≥255U) القيمة العظمى لنوع unsigned char
UINT_MAX (≥65535U) القيمة الدنيا لنوع unsigned int
ULONG_MAX (≥4294967295U) القيمة العظمى لنوع unsigned long
USHRT_MAX (≥65535U) القيمة الدنيا لنوع unsigned short

[جدول 1 أسماء ملف الترويسة <limits.h>]

ملاحظة: إذا كان التطبيق يعامل char على أنه من نوع ذو إشارة فقيمة CHAR_MAX وCHAR_MIN مماثلة لقيمة SCHAR الموافق لها، وإلا فقيمة CHAR_MIN هي صفر وقيمة CHAR_MAX هي مساوية لقيمة UCHAR_MAX.

ملف الترويسة <float.h>

يتضمن ملف الترويسة <float.h> قيمًا دنيا للأرقام ذات الفاصلة العائمة floating point بصورةٍ مشابهة لما سبق، ويمكن الافتراض عند عدم وجود قيمة دنيا لنوع ما أن هذا النوع لا يمتلك قيمة دنيا أو أن القيمة مرتبطة بقيمة أخرى.

الاسم القيم المسموحة الوصف
FLT_RADIX (≥2) تمثيل أساس الأس
DBL_DIG (≥10) عدد خانات الدقة في نوع double
DBL_EPSILON (≤1E−9) العدد الموجب الأدنى الذي يحقق 1.0‎ + x ≠ 1.0
DBL_MANT_DIG (—) عدد خانات أساس FLT_RADIX في الجزء العشري من النوع double
DBL_MAX (≥1E+37) القيمة العظمى لنوع double
DBL_MAX_10_EXP (≥‎+37) القيمة العظمى لأس (أساسه 10) من نوع double
DBL_MAX_EXP (—) القيمة العظمى لأس (أساسه FLT_RADIX) من نوع double
DBL_MIN (≤1E−37) القيمة الدنيا للنوع double
DBL_MIN_10_EXP (≤37) القيمة الدنيا لأس (أساسه 10) من نوع double
DBL_MIN_EXP (—) القيمة الدنيا لأس (أساسه FLT_RADIX) من نوع double
FLT_DIG (≥6) عدد خانات الدقة في نوع float
FLT_EPSILON (≤1E−5) العدد الموجب الأدنى الذي يحقق 1.0‎ + x ≠ 1.0
FLT_MANT_DIG (—) عدد خانات أساس FLT_RADIX في الجزء العشري من النوع float
FLT_MAX (≥1E+37) القيمة العظمى للنوع float
FLT_MAX_10_EXP (≥‎+37) القيمة العظمى لأس (أساسه 10) من نوع float
FLT_MAX_EXP (—) القيمة العظمة لأس (أساسه FLT_RADIX) من نوع float
FLT_MIN (≤1E−37) القيمة الدنيا للنوع float
FLT_MIN_10_EXP (≤‎−37) القيمة الدنيا لأس (أساسه 10) من نوع float
FLT_MIN_EXP (—) القيمة الدنيا لأس (أساسه FLT_RADIX) من نوع float
FLT_ROUNDS (0) يحدد التقريب للفاصلة العائمة، غير مُحدّد لقيمة 1-، تقريب باتجاه الصفر لقيمة 0، تقريب للقيمة الأقرب لقيمة 1، تقريب إلى اللا نهاية الموجبة لقيمة 2، تقريب إلى اللا نهاية السالبة لقيمة 3. أي قيمة أخرى تكون محددة بحسب التطبيق
LDBL_DIG (≥10) عدد خانات الدقة في نوع long double
LDBL_EPSILON (≤1E−9) العدد الموجب الأدنى الذي يحقق ‎1.0 + x ≠ 1.0
LDBL_MANT_DIG (—) عدد خانات أساس FLT_RADIX في الجزء العشري من النوع long double
LDBL_MAX (≥1E+37) القيمة العظمى للنوع long double
LDBL_MAX_10_EXP (≥‎+37) القيمة العظمى لأس (أساسه 10) من نوع long double
LDBL_MAX_EXP (—) القيمة العظمى لأس (أساسه FLT_RADIX) من نوع long double
LDBL_MIN (≤1E−37) القيمة الدنيا للنوع long double
LDBL_MIN_10_EXP (≤‎−37) القيمة الدنيا لأس (أساسه 10) من نوع long double
LDBL_MIN_EXP (—) القيمة الدنيا لأس (أساسه FLT_RADIX) من نوع long double

[جدول 2 أسماء ملف الترويسة <float.h>]

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

إذا كنت تكتب برامجًا رياضيّة تجري عمليات على الفاصلة العائمة وما شابه، فهذا يعني أنك تحتاج الوصول إلى مكتبات الدوال الرياضية دون أدنى شك، ويأخذ هذا النوع من الدوال وسطاءً من النوع double ويعيد نتيجةً من النوع ذاته أيضًا. تُعرَّف الدوال والماكرو المرتبطة بها في ملف الترويسة <math.h>.

يُستبدل الماكرو HUGE_VAL المُعرف إلى تعبير ذي قيمة موجبة من نوع عدد عشري مضاعف الدقة "double"، ولا يمكن تمثيله بالضرورة باستخدام النوع float.

نحصل على خطأ نطاق domain error في جميع الدوال إذا كانت قيمة الوسيط المُدخل خارج النطاق المُعرّف للدالة، مثل محاولة الحصول على جذر تربيعي لعدد سالب، وإذا حصل هذا الخطأ يُضبط errno إلى الثابت EDOM، وتُعيد الدالة قيمة معرّفة بحسب التطبيق.

نحصل على خطأ مجال range error إذا لم يكن من الممكن تمثيل نتيجة الدالة بقيمة عدد عشري مضاعف الدقة، تُعيد الدالة القيمة ‎±HUGE_VAL إذا كانت قيمة النتيجة كبيرة جدًا (الإشارة موافقة للقيمة) وتُضبط errno إلى ERANGE إذا كانت القيمة صغيرة جدًا وتُعاد القيمة 0.0 وتُعتمد قيمة errno على تعريف التطبيق.

تصف اللائحة التالية كلًا من الدوال المتاحة باختصار:

  • الدالة double acos(double x);‎: تُعيد القيمة الرئيسة Principal value لقوس جيب التمام Arc cosine للوسيط x في النطاق من 0 إلى π راديان، ونحصل على الخطأ EDOM إذا كان x خارج النطاق ‎-1 إلى 1.
  • الدالة double asin(double x);‎: تُعيد القيمة الرئيسة لقوس الجيب Arc sin للوسيط x في النطاق من ‎-π/2 إلى ‎+π/2 راديان، ونحصل على الخطأ EDOM إذا كان xخارج النطاق ‎-1 إلى 1.
  • الدالة double atan(double x);‎: تُعيد القيمة الرئيسة لقوس الظل Arc tan للوسيط x في النطاق من ‎-π/2 إلى ‎+π/2 راديان.
  • الدالة double atan2(double y, double x);‎: تُعيد القيمة الرئيسة لقوس الظل للقيمة y/x في النطاق من ‎-π إلى ‎+π راديان، وتستخدم إشارتي الوسيطين x و y لتحديد الربع الذي تقع فيه قيمة الإجابة، ونحصل على الخطأ EDOM في حال كان x و y مساويين إلى الصفر.
  • الدالة double cos(double x);‎: تُعيد جيب تمام قيمة الوسيط x (تُقاس x بالراديان).
  • الدالة double sin(double x);‎: تُعيد جيب قيمة الوسيط x (تُقاس x بالراديان).
  • الدالة double tan(double x);‎: تُعيد ظل قيمة الوسيط x (تُقاس x بالراديان)، وتكون إشارة HUGE_VAL غير مضمونة الصحّة إذا حدث خطأ مجال.
  • الدالة double cosh(double x);‎: تُعيد جيب التمام القطعي Hyperbolic للقيمة x، ونحصل على الخطأ ERANGE إذا كان مقدار x كبيرًا جدًا.
  • الدالة double sinh(double x);‎: تُعيد الجيب القطعي للقيمة x، ونحصل على الخطأ ERANGE إذا كان مقدار x كبيرًا للغاية.
  • الدالة double tanh(double x);‎: تُعيد الظل القطعي للقيمة x.
  • الدالة double exp(double x);‎: دالة أسية للقيمة x، ونحصل على الخطأ ERANGE إذا كان مقدار xكبيرًا جدًا.
  • الدالة double frexp(double value, int *exp);‎: تجزئة عدد ذو فاصلة عائمة إلى كسر طبيعي وأُس عدد صحيح من الأساس 2، ويخزن هذا العدد الصحيح في الغرض المُشار إليه بواسطة المؤشر exp.
  • الدالة double ldexp(double x, int exp);‎: ضرب x بمقدار 2 إلى الأُس exp، وقد نحصل على الخطأ ERANGE.
  • الدالة double log(double x);‎: اللوغاريتم الطبيعي للقيمة x، وقد نحصل على الخطأ EDOM إذا كانت القيمة x سالبة، و ERANGE إذا كانت x تساوي إلى الصفر.
  • الدالة double log10(double x);‎: اللوغاريتم ذو الأساس 10 للقيمة x، ونحصل على الخطأ EDOM إذا كانت x سالبة، و ERANGE إذا كانت x تساوي إلى الصفر.
  • الدالة double modf(double value, double *iptr);‎: تجزئة قيمة الوسيط value إلى جزء عدد صحيح وجزء كسري، ويحمل كل جزء إشارة الوسيط ذاتها، وتُخزن قيمة العدد الصحيح على أنها قيمة من نوع double في الكائن المُشار إليه بواسطة المؤشر iptr وتُعيد الدالة الجزء الكسري.
  • الدالة double pow(double x, double y);‎: تحسب x إلى الأس y، ونحصل على الخطأ EDOM إذا كانت القيمة x سالبة و y عدد غير صحيح، أو ERANGE إذا لم يكن من الممكن تمثيل النتيجة في حال كانت x تساوي إلى الصفر و y موجبة أو تساوي الصفر.
  • الدالة double sqrt(double x);‎: تحسب مربع القيمة x، ونحصل على الخطأ EDOM إذا كانت x سالبة.
  • الدالة double ceil(double x);‎: أصغر عدد صحيح لا يكون أصغر من x.
  • الدالة double fabs(double x);‎: القيمة المطلقة للوسيط x.
  • الدالة double floor(double x);‎: أكبر عدد صحيح لا يكون أكبر من x.
  • الدالة double fmod(double x, double y);‎: الباقي العشري من عملية القسمة x/y، ويعتمد الأمر على تعريف التطبيق فيما إذا كانت fmod تُعيد صفرًا أو خطأ نطاق في حال كانت y تساوي إلى الصفر.

ترجمة -وبتصرف- لقسم من الفصل Libraries من كتاب The C Book.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...