Search code examples
cfloating-pointfloating-point-precisionfloating-point-conversion

Confusion with floating point numbers


int main()
{
  float x=3.4e2;
  printf("%f",x);
  return 0;
}

Output:

340.000000  // It's ok.

But if write x=3.1234e2 the output is 312.339996 and if x=3.12345678e2 the output is 312.345673.

Why are the outputs like these? I think if I write x=3.1234e2 the output should be 312.340000, but the actual output is 312.339996 using GCC compiler.


Solution

  • Not all fractional numbers have an exact binary equivalent so it is rounded to the nearest value.

    Simplified example,

    if you have 3 bits for the fraction, you can have:

    0
    0.125
    0.25
    0.375
    ...
    

    0.5 has an exact representation, but 0.1 will be shown as 0.125.

    Of course the real differences are much smaller.