float
Хорошо, C ++ с плавающей точкой. FFloat32
является структурой, которая представляет число с плавающей точкой, а также (через объединение) разложенные битовые поля для частей знака, мантиссы и экспоненты этого числа с плавающей точкой.
Как правило, вы никогда не должны использовать, FFloat32
за исключением случаев, когда:
- вы используете какой-то API, который ожидает
FFloat32
(это очень редко) или
- вам нужно сделать какую-нибудь низкоуровневую битовую хакерскую операцию со значением с плавающей запятой (в наши дни это тоже довольно редко)
Это не значит, что FFloat32
это плохо , по сути, это просто , что это на самом деле не предложить вам все , что вы бы необходимо для общего назначения с плавающей точкой использования.
Он встречается реже, чем обычный старый float
, что оказывает незначительное влияние на читаемость (другие могут сразу не узнать, для чего он нужен). Кроме того, он не конвертируется в неявно, float
поэтому вы будете something.FloatValue
много печатать , что тоже не так уж сложно, но может стать утомительным.
Наконец, его использование объединений и битовых полей непереносимо и определяется реализацией (см. Ниже). Это не ваша проблема, задачей Epic является обеспечение того, чтобы тип был структурирован так, чтобы его можно было использовать для всех поддерживаемых реализаций, но это потенциальный источник ошибок, если они не могут обнаружить проблему с реализацией типа, когда новый компилятор версия выпущена или добавлена в список поддерживаемых компиляторов.
Поэтому, если вам не нужно играть с отдельными битами в представлении с плавающей запятой, вам, вероятно, следует просто избегать FFloat32
(его двоюродный брат FFloat16
, возможно, будет иметь немного больше полезности, поскольку не существует стандартного 16-битного типа C ++ с плавающей запятой).
Раньше было обычным манипулировать числами с плавающей точкой через целочисленные представления их компонентов для « скорости ». Современные компьютеры устраняют большую часть этой потребности для многих платформ, и различные методы штамповки типов , которые могут быть использованы для такого рода вещей, на самом деле могут нанести ущерб производительности или корректности в любом случае.
Следует отметить, что поиск в репозитории Unreal GitHub обнаруживает очень мало случаев использования этого FFloat32
типа. Все они находятся в определении самого FFloat32
себя или в определении FFloat16
.
В частности, FFloat32
делает две вещи, которые стандарт C ++ вызывает. Это:
- позволяет вам действовать так, как если бы более одного члена профсоюза были активны одновременно; от вас ожидается запись в члены с плавающей запятой и чтение из одного из целочисленных членов (9.5.1, [class.union])
- ожидает, что распределение битовых полей в объединении совпадает с распределением битов значения IEEE с плавающей запятой; однако распределение и выравнивание элементов битового поля в типе класса определяется реализацией (9.6.1, [class.bit])
FFloat32
.