المتغيرات
فضاءات التسمية
أفعال

modf, modff, modfl

من cppreference.com
< c‏ | numeric‏ | math
 
 
 
دوال رياضية شائعة
الدوال
عمليات بسيطة
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)
دوال أسية ولوغارتمية ثابتة الأساس
(C99)
(C99)
(C99)
(C99)
دوال أسية وجذور
(C99)
(C99)
دوال حساب المثلثات والدول الزائدية
(C99)
(C99)
(C99)
دالة الخطأ ودالة غاوس
(C99)
(C99)
(C99)
(C99)
إيجاد أقرب عدد صحيح لفاصلة عائمة (float)
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
دوال التعديل على الفاصلة العائمة (float)
(C99)(C99)
(C99)
(C99)
modf
التصنيف والمقارنة
(C99)
(C99)
(C99)
ثوابت ماكرو
 
معرفة في ملف <math.h>
float       modff( float arg, float* iptr );
(1) (منذ C99)
double      modf( double arg, double* iptr );
(2)
long double modfl( long double arg, long double* iptr );
(3) (منذ C99)
1-3) تقسم عدد ذو فاصلة عائمة ‎arg‎ إلى جزء صحيح وجزء كسري كليهما نفس نوع وإشارة ‎arg‎. يتم تخزين الجزء الصحيح كعدد ذو فاصلة عائمة في الكائن المشار إليه بـ ‎iptr‎.

محتويات

[تعديل] المعطيات

arg - عدد ذو فاصلة عائمة
iptr - مؤشر على كائن ذو فاصلة عائمة سيحمل قيمة الجزء الصحيح


[تعديل] القيمة المُرجعة

ترجع الجزء الكسري لـ ‎arg‎ مع الإحتفاظ بالإشارة. في حالة النجاح, ترجع الجزء الكسري لـ ‎arg‎ مع الإحتفاظ بالإشارة. يتم تخزين الجزء الصحيح كعدد ذو فاصلة عائمة في الكائن المشار إليه بـ ‎iptr‎.

مجموع القيمة المُرجعة والقيمة المخزنة في ‎*iptr‎‎ يساوي ‎arg‎

[تعديل] التعامل مع الأخطاء

لا تخضع هذه الدالة لطرق التعامل مع لأخطاء الموضحة في math_errhandling.

إذا كانت البيئة تدعم حسابات الفاصلة العائمة طبقا للـ IEEE (المعيار IEC 60559 تحديدا):

  • لو كان المعطى ‎arg‎ مساويا ±0, يتم إرجاعه دون تعديل ويتم تخزين نفس القيمة كذلك في ‎*iptr.
  • لو كان المعطى ‎arg‎ مساويا ±∞, يتم إرجاع ±0 وتخزين ±∞ في ‎*iptr.
  • لو كان المعطى ‎arg‎ مساويا NaN, يتم إرجاع NaN ويتم تخزين NaN في ‎*iptr.
  • القيمة المُرجعة دقيقة, يلا يؤخذ وضع التقريب الحالي في الاعتبار.

[تعديل] ملحوظات

سلوك الدالة يوافق تماما هذا الكود:

double modf(double value, double *iptr)
{
#pragma STDC FENV_ACCESS ON
    int save_round = fegetround();
    fesetround(FE_TOWARDZERO);
    *iptr = std::nearbyint(value);
    fesetround(save_round);
    return copysign(isinf(value) ? 0.0 : value - (*iptr), value);
}

[تعديل] مثال

#include <stdio.h>
#include <math.h>
#include <float.h>
 
int main(void)
{
    double f = 123.45;
    printf("Given the number %.2f or %a in hex,\n", f, f);
 
    double f3;
    double f2 = modf(f, &f3);
    printf("modf() makes %.2f + %.2f\n", f3, f2);
 
    int i;
    f2 = frexp(f, &i);
    printf("frexp() makes %f * 2^%d\n", f2, i);
 
    i = ilogb(f);
    printf("logb()/ilogb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i);
 
    // special values
    f2 = modf(-0.0, &f3);
    printf("modf(-0) makes %.2f + %.2f\n", f3, f2);
    f2 = modf(-INFINITY, &f3);
    printf("modf(-Inf) makes %.2f + %.2f\n", f3, f2);
}

خرج ممكن:

Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123.00 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
modf(-0) makes -0.00 + -0.00
modf(-Inf) makes -INF + -0.00

[تعديل] أنظر أيضا

(C99)(C99)(C99)
rounds to nearest integer not greater in magnitude than the given value
(دالة) [edit]