Ils ne sont pas codé de la même manière.
Dans un unsigned long tous les bits codent le nombre d'où 2^32 valeurs.
Dans un float le nombre est codé sous la forme mantisse plus exposant. Une partie des bits codent la mantisse et les reste des bits codent l'exposant. De ce fait on peut coder des nombres plus grand mais en contre partie on est limité en précision.
Plus de détails ici : Float — Wikipédia