modf, modff, modfl
من cppreference.com
| معرفة في ملف <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 (دالة) |
| مقالة مرجع C++ عن modf
|

