modf, modff, modfl
من cppreference.com
<tbody>
</tbody>
| معرفة في ملف <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
| |