Hi, I'm trying to get the fractional part of a floating point
number. I've tried fmod() and modf(), and while both do work, they
also occasionally return 1.0 for the fractional part of the number
instead of 0.0. This is on a mac using xcode. This should not ever
happen should it?
Run the following, modifying EXTRADIGITS as required, and watch the
output. Consider how that might pertain to your question.
#include <math.h>
#include <stdio.h>
#include <float.h>
#define EXTRADIGITS 2
int main()
{
double intpart, fraction, decrement = 1, value;
int i;
printf("Demonstration of modf and default precision\n");
for (i = 0; i <= DBL_DIG + EXTRADIGITS; i++, decrement /= 10.) {
value = 1 - decrement;
printf("decrement = %g (default), %.*g;\n"
" 1-decrement = %g (default), %.*g\n",
decrement, DBL_DIG, decrement, value, DBL_DIG, value);
fraction = modf(value, &intpart);
printf("modf returns:\n"
" fraction = %g (default), %.*g,\n"
" intpart = %g (default), %.*g.\n\n",
fraction, DBL_DIG, fraction, intpart, DBL_DIG, intpart);
}
return 0;
}
Demonstration of modf and default precision
decrement = 1 (default), 1;
1-decrement = 0 (default), 0
modf returns:
fraction = 0 (default), 0,
intpart = 0 (default), 0.
decrement = 0.1 (default), 0.1;
1-decrement = 0.9 (default), 0.9
modf returns:
fraction = 0.9 (default), 0.9,
intpart = 0 (default), 0.
decrement = 0.01 (default), 0.01;
1-decrement = 0.99 (default), 0.99
modf returns:
fraction = 0.99 (default), 0.99,
intpart = 0 (default), 0.
decrement = 0.001 (default), 0.001;
1-decrement = 0.999 (default), 0.999
modf returns:
fraction = 0.999 (default), 0.999,
intpart = 0 (default), 0.
decrement = 0.0001 (default), 0.0001;
1-decrement = 0.9999 (default), 0.9999
modf returns:
fraction = 0.9999 (default), 0.9999,
intpart = 0 (default), 0.
decrement = 1e-05 (default), 1e-05;
1-decrement = 0.99999 (default), 0.99999
modf returns:
fraction = 0.99999 (default), 0.99999,
intpart = 0 (default), 0.
decrement = 1e-06 (default), 1e-06;
1-decrement = 0.999999 (default), 0.999999
modf returns:
fraction = 0.999999 (default), 0.999999,
intpart = 0 (default), 0.
decrement = 1e-07 (default), 1e-07;
1-decrement = 1 (default), 0.9999999
modf returns:
fraction = 1 (default), 0.9999999,
intpart = 0 (default), 0.
decrement = 1e-08 (default), 1e-08;
1-decrement = 1 (default), 0.99999999
modf returns:
fraction = 1 (default), 0.99999999,
intpart = 0 (default), 0.
decrement = 1e-09 (default), 1e-09;
1-decrement = 1 (default), 0.999999999
modf returns:
fraction = 1 (default), 0.999999999,
intpart = 0 (default), 0.
decrement = 1e-10 (default), 1e-10;
1-decrement = 1 (default), 0.9999999999
modf returns:
fraction = 1 (default), 0.9999999999,
intpart = 0 (default), 0.
decrement = 1e-11 (default), 1e-11;
1-decrement = 1 (default), 0.99999999999
modf returns:
fraction = 1 (default), 0.99999999999,
intpart = 0 (default), 0.
decrement = 1e-12 (default), 1e-12;
1-decrement = 1 (default), 0.999999999999
modf returns:
fraction = 1 (default), 0.999999999999,
intpart = 0 (default), 0.
decrement = 1e-13 (default), 1e-13;
1-decrement = 1 (default), 0.9999999999999
modf returns:
fraction = 1 (default), 0.9999999999999,
intpart = 0 (default), 0.
decrement = 1e-14 (default), 1e-14;
1-decrement = 1 (default), 0.99999999999999
modf returns:
fraction = 1 (default), 0.99999999999999,
intpart = 0 (default), 0.
decrement = 1e-15 (default), 1e-15;
1-decrement = 1 (default), 0.999999999999999
modf returns:
fraction = 1 (default), 0.999999999999999,
intpart = 0 (default), 0.
decrement = 1e-16 (default), 1e-16;
1-decrement = 1 (default), 1
modf returns:
fraction = 1 (default), 1,
intpart = 0 (default), 0.
decrement = 1e-17 (default), 1e-17;
1-decrement = 1 (default), 1
modf returns:
fraction = 0 (default), 0,
intpart = 1 (default), 1.