Vous pouvez faire des manipulations de bits sur des nombres à virgule flottante, mais pour bien faire les choses, il faut savoir exactement quelle est la représentation binaire de la virgule flottante. Pour la plupart des machines de nos jours, c'est IEEE-754 ce qui est assez simple. Par exemple, les flottants 32 bits IEEE-754 ont 1 bit de signe, 8 bits d'exposant et 23 bits de mantisse. Vous pouvez donc utiliser des décalages et des masques pour extraire ces champs et en faire quelque chose. Il est donc assez facile de faire des troncatures (arrondir à l'entier vers 0) :
float trunc(float x) {
union {
float f;
uint32_t i;
} val;
val.f = x;
int exponent = (val.i >> 23) & 0xff; // extract the exponent field;
int fractional_bits = 127 + 23 - exponent;
if (fractional_bits > 23) // abs(x) < 1.0
return 0.0;
if (fractional_bits > 0)
val.i &= ~((1U << fractional_bits) - 1);
return val.f;
}
Tout d'abord, nous extrayons le champ de l'exposant et l'utilisons pour calculer le nombre de bits après l'élément le point décimal sont présents dans le nombre. S'il y en a plus que la taille de la mantisse, nous retournons simplement 0. Sinon, s'il y en a au moins 1, nous masquons (effaçons) le nombre de bits de poids faible. C'est assez simple. Nous ignorons les dénormaux, NaN, et l'infini, mais cela ne pose pas de problème, car ils ont des exposants de tous les 0 ou tous les 1, ce qui signifie que nous finissons par convertir les dénormaux en 0 (ils sont pris dans le premier si, avec les petits nombres normaux), et laisser NaN/Inf inchangé.
Pour faire un plancher, il faut aussi regarder le signe et arrondir les nombres négatifs vers le haut, vers l'infini négatif.
Notez que cela est certainement plus lent que d'utiliser des instructions dédiées à la virgule flottante, donc ce genre de chose n'est vraiment utile que si vous avez besoin d'utiliser des nombres en virgule flottante sur du matériel qui n'a pas de support natif de la virgule flottante. Ou si vous voulez simplement jouer et apprendre comment ces choses fonctionnent à un bas niveau.