Bonjour,

Je suis en train d'implémenter le radix sort en C++, et j'aimerais bien l'implémenter pour trier des nombres flottants.
Ce n'est pas une question d'algorithmie que je vous demande, mais j'ai plutôt un problème avec le langage.

Pour trier les float, je dois lire les valeurs de chaque bit du float (L'algorithme fonctionnera pour les float enregistrés selon la norme IEEE). Je voulais donc utiliser les opérateurs bitwise (& logique), mais le langage interdit de faire un & entre un float et un int (3.f & 1 est interdit).

La solution que j'ai implémentée me retourne un warning que je ne comprends pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
float f = /* something */;
int a = *reinterpreter_cast<int*>(&f);
De cette façon là, je récupère les bits de "f" et je peux les lire via "a". Lorsque ce code s'exécute, il a déjà été vérifié que sizeof(int) == sizeof(float) (Si la taille est différente, l'algorithme sera faux, mais est-ce que ça peut mener à un crash du programme ?).
Le problème de cette méthode est que j'obtiens un warning :
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] (GCC 4.6.x)
Je ne comprends pas que ça veut dire. Néanmoins, si je fais :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
float f = /* something */;
int* pa = reinterpreter_cast<int*>(&f);
int a = *pa;
Le warning disparait. (Pourtant les deux codes ont l'air équivalents...)

Ma première question est : y a-t-il un moyen simple de contourner la limitation (& logique interdit entre float et int) ?
Ensuite : ma solution est-elle dangereuse ? (sinon laquelle préférer entre les deux ?)