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