Comme Zerosquare l'a écrit, un cast *explicite* n'a pas forcément à préserver la totalité des données lors de l'opération de conversion, c'est pour ça qu'il est explicite.
Mais c'est vrai que pour les float on autorise la conversion implicite en langage C traditionnel (ainsi que la plupart de ses dérivés comme le C++, le Java, le C# et d'autres encore…)
Je pense que par souci de clarté dans le code, on préfère autoriser
float f = 5; plutôt que devoir écrire
float f = 5f ou pire encore
float f = (float)5; à chaque fois
Après, c'est vrai que certaines valeurs ne peuvent pas être représentées exactement par un float, mais ce sont des valeurs supérieures à
2^24 si je ne dis pas de bêtises. D'ailleurs je ne sais pas si le compilateur te génère un avertissement lorsque tu tentes de convertir une de ces valeurs… (Je pense que non)