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: | Major | Last Reviewed: | 12/11/2003 |
---|
Keywords: | kbcode kbCRT kbinfo KB57479 |
---|
|