float
, está bien, un punto flotante C ++. FFloat32
es una estructura que representa un flotador, así como (a través de una unión) los campos de bits descompuestos para las partes de signo, mantisa y exponente de ese flotador.
Por lo general, nunca debe usar, FFloat32
excepto cuando:
- está utilizando alguna API que espera un
FFloat32
(estos son muy raros) o
- necesita hacer algún tipo de piratería de bajo nivel con un valor de coma flotante (también bastante raro en estos días)
No es que FFloat32
sea malo , per se, es que realmente no le ofrece nada que necesite para el uso de punto flotante de uso general.
Es menos común que un viejo simple float
, que tiene un impacto de legibilidad menor (otros pueden no saber de inmediato para qué sirve de un vistazo). Tampoco se convierte implícitamente, por float
lo que escribirás something.FloatValue
mucho, lo que tampoco es un gran problema, pero podría ser tedioso.
Finalmente, su uso de uniones y campos de bits no es portátil y está definido por la implementación (ver más abajo). Este no es su problema, es el trabajo de Epic asegurarse de que el tipo esté estructurado de modo que sea utilizable para todas las implementaciones compatibles, pero es una fuente potencial de errores si no detectan un problema con la implementación del tipo cuando un nuevo compilador La versión se publica o se agrega a la lista de compiladores compatibles.
Entonces, a menos que tenga la necesidad de jugar con los bits individuales en la representación de coma flotante, probablemente debería evitarlo FFloat32
(su primo FFloat16
puede tener un poco más de utilidad ya que no hay un tipo de coma flotante C ++ estándar de 16 bits).
Solía ser común manipular flotadores a través de representaciones enteras de sus componentes para " velocidad ". Las computadoras modernas eliminan gran parte de esa necesidad de muchas plataformas, y las diversas técnicas de tipografía que podrían usarse para hacer este tipo de cosas pueden ser realmente perjudiciales para el rendimiento o la corrección en cualquier caso.
Debería ser revelador que una búsqueda en el repositorio GitHub de Unreal revela muy pocos usos del FFloat32
tipo. Todos ellos están en la definición de FFloat32
sí mismos o en la definición de FFloat16
.
Específicamente, FFloat32
hace dos cosas que llama el estándar C ++. Eso:
- le permite actuar como si más de un miembro del sindicato estuviera activo al mismo tiempo; se espera que escriba en los miembros de coma flotante y lea de uno de los miembros enteros (9.5.1, [class.union])
- espera que la asignación de campo de bits dentro de la unión coincida con la asignación de bits de un valor de coma flotante IEEE; sin embargo, la asignación y alineación de los miembros del campo de bits dentro de un tipo de clase está definida por la implementación (9.6.1, [class.bit])
FFloat32
.