fmod, fmodf, fmodl
| معرفة في ملف <math.h>
|
||
float fmodf( float x, float y ); |
(1) | (منذ C99) |
double fmod( double x, double y ); |
(2) | |
long double fmodl( long double x, long double y ); |
(3) | (منذ C99) |
| معرفة في ملف <tgmath.h>
|
||
#define fmod( x, y ) |
(4) | (منذ C99) |
x/y.long double يتم استدعاء 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
xis ±0 andyis 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 ON
double 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 ON
int 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
| |