I have the following program:
float x = 3.e17;
printf("x = %f", x);
which gives the result:
x = 299999995292024832.000000
why is the result not 300000000000000000.000000?
I have the following program:
float x = 3.e17;
printf("x = %f", x);
which gives the result:
x = 299999995292024832.000000
why is the result not 300000000000000000.000000?
 
    
    Because of limited float precision. Use double for more precision, but floating point is not always exact
 
    
    #include <stdio.h>
#include <stdlib.h>
union
{
    double d;
    float f;
    unsigned int ui[2];
} myun;
int main ( void )
{
    float  fx = 3.e17;
    double dx = 3.e17;
    printf("fx %f\n",fx);
    printf("dx %lf\n",dx);
    myun.f=fx;
    printf("fx 0x%08X\n",myun.ui[0]);
    myun.ui[0]++;
    printf("fx %lf\n",myun.f);
    myun.d=dx;
    printf("dx 0x%08X 0x%08X\n",myun.ui[1],myun.ui[0]);
    return(0);
}
(yes this is an incorrect/invalid way to use a union but it just happened to work)
fx 299999995292024832.000000
dx 300000000000000000.000000
fx 0x5C853A0D
fx 300000029651763200.000000
dx 0x4390A741 0xA4627800
wikipedia points out that single can handle up to 9 digits without a loss of precision and double 15-17. So right there is your answer, didnt necessarily need to do an experiment.
