نتطرق في هذا المقال إلى كل من ملفات الترويسة الخاصة بالقيم الحدّية 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.

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