fmod, fmodf, fmodl
معرفة في ملف <math.h> | ||
float fmodf(float x, float y ); | (1) | (منذ C99) |
double fmod(double x, double y ); | (2) | |
longdouble fmodl(longdouble x, longdouble y ); | (3) | (منذ C99) |
معرفة في ملف <tgmath.h> | ||
#define fmod( x, y ) | (4) | (منذ C99) |
fmodl
. أما إذا كان المعطى عدد صحيح أو من النوع double يتم استدعاء fmod
. فيما عدا ذلك يتم استدعاء fmodf
.باقي القسمة الناتج عن العملية x/y يساوي بالضبط x - n*y حيث n
هي x/y بعد إزالة الجزء الكسري
القيمة المُرجعة إشارتها نفس إشارة x
ودائما ماتكون قيمتها المطلقة أصغر من أو يساوي y
محتويات |
[تعديل]المعطيات
x, y | - | عددين ذوي فاصلة عائمة |
[تعديل]القيمة المُرجعة
في حالة النجاح, تُرجع باقي قسمة ذو فاصلة عائمة كما هو معرف بالأعلى
لو كان هناك خطأ في المجال يتم إرجاع قيمة تحددها البيئة (غالبا NaN على الأنظمة الداعمة لذلك).
لو كان هناك خطأ في المدى نتيجة الطفح لأسفل (Underflow) يتم إرجاع القيمة الصحيحة بعد التقريب.
[تعديل]التعامل مع الأخطاء
يتم الإبلاغ عن الأخطاء كما هو موضح في math_errhandling.
إذا كانت y
بصفر ربما يحدث خطأ في المجال.
إذا كانت البيئة تدعم حسابات الفاصلة العائمة طبقا للـ IEEE (المعيار IEC 60559 تحديدا):
- If
x
is ±0 andy
is not zero, ±0 احذفني is returned - لو كان
x
بـ ±∞ وy
قيمة عدا NaN, يتم إرجاع NaN ورفع الإشارة FE_INVALID - لو كان
y
بـ ±0 وx
قيمة عدا NaN, يتم إرجاع NaN ورفع الإشارة FE_INVALID - لو كان
y
بـ ±∞ وx
قيمة نهائية, يتم إرجاعx
- لو أي من المعطيين NaN يتم إرجاع NaN
[تعديل]ملحوظات
تشترط POSIX حدوث خطأ في المجال إذا كانت x
لانهائية أو كانت y
بصفر.
تتصرف النسخة الـ double من fmod كما لو تم تطبيقها كالآتي:
double fmod(double x, double y){#pragma STDC FENV_ACCESS ONdouble result = remainder(fabs(x), (y = fabs(y)));if(signbit(result)) result += y;return copysign(result, x);}
[تعديل]مثال
#include <stdio.h>#include <math.h>#include <fenv.h> #pragma STDC FENV_ACCESS ONint main(void){ printf("fmod(+5.1, +3.0) = %.1f\n", fmod(5.1,3)); printf("fmod(-5.1, +3.0) = %.1f\n", fmod(-5.1,3)); printf("fmod(+5.1, -3.0) = %.1f\n", fmod(5.1,-3)); printf("fmod(-5.1, -3.0) = %.1f\n", fmod(-5.1,-3)); // special values printf("fmod(+0.0, 1.0) = %.1f\n", fmod(0, 1)); printf("fmod(-0.0, 1.0) = %.1f\n", fmod(-0.0, 1)); printf("fmod(+5.1, Inf) = %.1f\n", fmod(5.1, INFINITY)); // error handling feclearexcept(FE_ALL_EXCEPT); printf("fmod(+5.1, 0) = %.1f\n", fmod(5.1, 0));if(fetestexcept(FE_INVALID)) puts(" FE_INVALID raised");}
خرج ممكن:
fmod(+5.1, +3.0) = 2.1 fmod(-5.1, +3.0) = -2.1 fmod(+5.1, -3.0) = 2.1 fmod(-5.1, -3.0) = -2.1 fmod(+0.0, 1.0) = 0.0 fmod(-0.0, 1.0) = -0.0 fmod(+5.1, Inf) = 5.1 fmod(+5.1, 0) = nan FE_INVALID raised
[تعديل]أنظر أيضا
تحسب خارج وباقي قسمة عددين صحيحين (C99) (دالة) | |
(C99)(C99)(C99) | تحسب باقي قسمة ذو إشارة لعددين ذوي فاصلة عائمة (دالة) |
(C99)(C99)(C99) | تحسب باقي قسمة ذو إشارة بالإضافة إلى آخر 3 بت من ناتج القسمة (دالة) |
مقالة مرجع C++ عن fmod |