La fonction de modèle ci-dessous fait partie d'un générateur de séquences. Au lieu de décalages manuels, j'ai trouvé la solution basée sur les unions suivante pour rendre les opérations plus explicites. Ça fonctionne bien sur tous les compilateurs testés. Lien Godbolt.
Cependant, malgré son bon fonctionnement en pratique, je crains que les règles d'aliasing ne soient violées, ce qui signifie que cela pourrait ne pas fonctionner à l'avenir ou sur un autre compilateur que GCC et CLANG.
Strictement du point de vue de la norme C++ : le code ci-dessous est-il bien formé ? Est-ce qu'il entraîne un comportement indéfini ?
template
uint64_t flog2(uint64_t num) {
constexpr uint64_t MAXNUM = (uint64_t(1) << BITS);
if (num < MAXNUM) return num;
union FP {
double dbl;
struct {
uint64_t man: 52;
uint32_t exp: 11;
uint32_t sign: 1;
};
struct {
uint64_t xman: 52-BITS;
uint32_t xexp: 11+BITS;
uint32_t xsgn: 1;
};
};
FP fp;
fp.dbl = num;
fp.exp -= 1023-1+BITS;
return fp.xexp;
}
Merci !