INF: fmod() Results Unexpected Due to Binary Representation

ID Number: Q57479

5.10 6.00 6.00a 6.00ax 7.00 | 5.10 6.00 6.00a

MS-DOS | OS/2

Summary:

Although there isn't a problem with the fmod() function, the following

program generates incorrect results when the divisor, f2, cannot be

precisely represented in binary.

Sample Code

-----------

/* Compile options needed: none

*/

#include <stdio.h>

#include <math.h>

void main(void)

{

double f1, f2, f3;

scanf("%lf %lf", &f1, &f2);

f3 = fmod(f1, f2);

printf("f3 = %.15lf\n", f3);

}

More Information:

To illustrate the problem, enter the values 2.0 and 0.2 for f1 and f2,

respectively. The fmod() function should return 0 (zero), the

floating-point remainder of 2.0/0.2. Instead, it returns the value 0.2

because 0.2 does not translate cleanly into binary representation. A

value of 0.25 for f2 works correctly because it does translate

precisely into binary.

Additional reference words: 5.10 6.00 6.00a 6.00ax 7.00 s_quickc