INFO: fmod() Results Unexpected Due to Binary Representation (57479)



The information in this article applies to:

  • The C Run-Time (CRT), when used with:
    • Microsoft Visual C++ for Windows, 16-bit edition 1.0
    • Microsoft Visual C++ for Windows, 16-bit edition 1.5
    • Microsoft Visual C++, 32-bit Editions 1.0
    • Microsoft Visual C++, 32-bit Editions 2.0
    • Microsoft Visual C++, 32-bit Editions 4.0
    • Microsoft Visual C++, 32-bit Editions 5.0
    • Microsoft Visual C++, 32-bit Editions 6.0

This article was previously published under Q57479
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);

}
		
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.

Modification Type:MajorLast Reviewed:12/11/2003
Keywords:kbcode kbCRT kbinfo KB57479