Microsoft KB Archive/57479

From BetaArchive Wiki
Knowledge Base


INFO: fmod() Results Unexpected Due to Binary Representation

Article ID: 57479

Article Last Modified on 12/11/2003



APPLIES TO

  • The C Run-Time (CRT), when used with:
    • Microsoft Visual C++ 1.0 Professional Edition
    • Microsoft Visual C++ 1.5 Professional Edition
    • Microsoft Visual C++ 1.0 Professional Edition
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 5.0 Standard Edition
    • Microsoft Visual C++ 6.0 Service Pack 5



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.

Keywords: kbinfo kbcrt kbcode KB57479