What you're seeing is not exactly what the content of the variables is, but what the standard ouptut stream outputs after rounding them. Look up the std::setprecision
function from the header <iomanip>
.
A quick test on Coliru with:
float f = 0.123456789;
double d = 0.123456789;
std::cout << "float = " << std::setprecision(13) << f << std::endl;
std::cout << "double = " << std::setprecision(13) << d << std::endl;
yields the output:
float = 0.1234567910433
double = 0.123456789
It shows that indeed, float and double are not the same type in terms of which numbers they can represent. (Hint: this is not even the exact number stored in the float, only the one rounded to 13 significant digits).