float
, est bien, une virgule flottante C ++. FFloat32
est une structure qui représente un flotteur ainsi que (via une union) les champs de bits décomposés pour le signe, la mantisse et les parties exposantes de ce flotteur.
Vous ne devez généralement jamais utiliser FFloat32
sauf lorsque:
- vous utilisez une API qui attend un
FFloat32
(ce sont très rares) ou
- vous devez faire une sorte de piratage de bits de bas niveau avec une valeur en virgule flottante (également assez rare de nos jours)
Ce n'est pas FFloat32
est mauvais , en soi, il est juste que ça n'a pas vraiment vous offrir tout ce dont vous auriez besoin pour usage général flottant utilisation ponctuelle.
Il est moins courant qu'un ancien simple float
, ce qui a un impact mineur sur la lisibilité (d'autres peuvent ne pas savoir immédiatement à quoi il sert en un coup d'œil). Il ne se convertit pas non plus implicitement en float
donc vous taperez something.FloatValue
beaucoup, ce qui n'est pas non plus un gros problème, mais pourrait devenir fastidieux.
Enfin, son utilisation des unions et des champs de bits est non portable et définie par l'implémentation (voir ci-dessous). Ce n'est pas votre problème, c'est le travail d'Epic de s'assurer que le type est structuré de manière à ce qu'il soit utilisable pour toutes les implémentations prises en charge, mais c'est une source potentielle de bogues s'ils ne parviennent pas à résoudre un problème avec l'implémentation du type lorsqu'un nouveau compilateur version est publiée ou ajoutée à la liste des compilateurs pris en charge.
Donc, à moins que vous n'ayez besoin de jouer avec les bits individuels dans la représentation en virgule flottante, vous devriez probablement éviter FFloat32
(son cousin FFloat16
, peut avoir un peu plus d'utilité car il n'y a pas de type à virgule flottante C ++ 16 bits standard).
Autrefois, il était courant de manipuler des flotteurs via des représentations entières de leurs composants pour la " vitesse ". Les ordinateurs modernes évitent une grande partie de ce besoin pour de nombreuses plates-formes, et les diverses techniques de punition de type qui pourraient être utilisées pour faire ce genre de chose peuvent en fait nuire aux performances ou à l'exactitude en tout état de cause.
Il devrait être révélateur qu'une recherche dans le référentiel GitHub d'Unreal révèle très peu d'utilisations du FFloat32
type. Tous sont dans la définition de FFloat32
soi ou dans la définition de FFloat16
.
Plus précisément, FFloat32
fait deux choses que la norme C ++ appelle. Il:
- vous permet d'agir comme si plus d'un membre du syndicat était actif à la fois; vous devez écrire sur les membres à virgule flottante et lire à partir de l'un des membres entiers (9.5.1, [class.union])
- attend que l'allocation de champ de bits au sein de l'union corresponde à celle de l'allocation de bits d'une valeur à virgule flottante IEEE; cependant, l'allocation et l'alignement des membres du champ binaire au sein d'un type de classe est défini par l'implémentation (9.6.1, [class.bit])
FFloat32
.