modf, modff, modfl
من cppreference.com
معرفة في ملف <math.h> | ||
float modff(float arg, float* iptr ); | (1) | (منذ C99) |
double modf(double arg, double* iptr ); | (2) | |
longdouble modfl(longdouble arg, longdouble* 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 ONint 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 (دالة) |
مقالة مرجع C++ عن modf |