float
, jest dobrze zmiennoprzecinkowe w C ++. FFloat32
jest strukturą, która reprezentuje liczbę zmiennoprzecinkową, a także (za pośrednictwem unii) zdekomponowane pola bitowe dla znaku tego elementu, części mantysy i wykładnika.
Zasadniczo nigdy nie należy używać, FFloat32
z wyjątkiem sytuacji, gdy:
- używasz interfejsu API, który oczekuje
FFloat32
(są one bardzo rzadkie) lub
- musisz zrobić coś w rodzaju hakowania bitów na niskim poziomie z wartością zmiennoprzecinkową (obecnie również dość rzadkim)
Nie FFloat32
jest źle , po prostu, po prostu nie oferuje niczego, czego potrzebujesz do ogólnego zastosowania zmiennoprzecinkowego.
Jest mniej powszechny niż zwykły stary float
, który ma niewielki wpływ na czytelność (inni mogą od razu nie wiedzieć, do czego służy). Nie jest też domyślnie konwertowany na, float
więc będziesz something.FloatValue
dużo pisać , co również nie jest wielką sprawą, ale może być nudne.
Wreszcie, użycie związków i pól bitowych jest nieprzenośne i zdefiniowane w implementacji (patrz poniżej). To nie jest twój problem, zadaniem Epica jest upewnienie się, że typ jest tak skonstruowany, aby można go było używać we wszystkich obsługiwanych implementacjach, ale jest to potencjalne źródło błędów, jeśli nie wychwycą problemu z implementacją typu, gdy nowy kompilator wersja została wydana lub dodana do listy obsługiwanych kompilatorów.
Tak więc, chyba że musisz grać pojedynczymi bitami w reprezentacji zmiennoprzecinkowej, powinieneś prawdopodobnie po prostu unikać FFloat32
(jej kuzyn FFloat16
, może mieć nieco większą użyteczność, ponieważ nie ma standardowego 16-bitowego typu zmiennoprzecinkowego C ++).
Kiedyś było tak powszechne manipulować pływaków pośrednictwem przedstawicielstw całkowite ich komponentów dla „ prędkość ”. Współczesne komputery eliminują wiele z potrzeby posiadania wielu platform, a różne techniki znakowania czcionkami , które mogą być użyte do tego rodzaju czynności, mogą w rzeczywistości w każdym przypadku być szkodliwe dla wydajności lub poprawności.
Warto powiedzieć, że wyszukiwanie w repozytorium GitHub Unreal ujawnia bardzo niewiele zastosowań tego FFloat32
typu. Wszystkie są w definicji FFloat32
siebie lub w definicji FFloat16
.
W szczególności FFloat32
robi dwie rzeczy, które wywołuje standard C ++. To:
- pozwala działać tak, jakby więcej niż jeden członek związku działał jednocześnie; musisz pisać do elementów zmiennoprzecinkowych i czytać z jednego z elementów całkowitych (9.5.1, [class.union])
- oczekuje, że przydział pola bitowego w unii będzie zgodny z przydziałem bitowym wartości zmiennoprzecinkowej IEEE; jednak przydział i wyrównanie elementów pola bitowego w ramach typu klasy jest zdefiniowane w implementacji (9.6.1, [class.bit])
FFloat32
.