Typ Half – nowy typ danych w .NET 5 Preview 7
Typ Half jest nowym zmiennoprzecinkowym typem danych wprowadzonym przez firmę Microsoft do .NET 5 Preview 7. Dotychczas w specyfikacji IEEE 754 zdefiniowano wiele innych typów, takich jak binary16, binary32 (w C# float), binary64 (odpowiednik double w C#) czy binary128. Zmienne tego typu zapewniają standardowy format, dzięki któremu przekazuje się szeroki zakres wartości. W NET zawsze miał zmienne typu float oraz double. Teraz dodano zmienną Half, odpowiednik binary16.
Typ Half
Half określono w standardzie IEEE 754 dla arytmetyki zmiennoprzecinkowej. Ten typ jest zdefiniowany jako 16-bitowy format wymiany o podstawie 2. Zajmuje 16 bitów, o połowę mniej niż float. Bity podzielono następująco – jeden bit znaku, pięć bitów wykładnika i 10 bitów mantysy. Mantysa posiada jeden ukryty bit, który nie jest przechowywany. Reprezentuje wartości z zakresu ± 65504. Służy do wymiany danych między implementacjami. Dzięki nowemu typowi zmiennej oszczędza się miejsce w pamięci, tam, gdzie wynik nie musi być przechowywany z pełną precyzją.
Zmienna Half – zapis
Ogólnie typ zmiennej zapisuje się w następującej postaci:
-1^(bit znaku)*2^(zapisany wykładnik -15)*(ukryty bit+(znaczące bity/1024))
Liczba jeden przy pomocy typu half zapisuje się jako:
0 01111 0000000000 = 1
Pierwszy bit – 0 – oznacza liczbę dodatnią. Dalej, bity wykładnika – 01111 (w postaci dziesiętnej – 15), które jednak nie reprezentują bezpośrednio wykładnika, a tylko jego odchylenie. Właściwy wykładnik wyprowadza się przez odjęcie 15 od zapisanego wykładnika. Mantysą jest 0000000000, co interpretuje się jako liczbę .significand (o podstawie 2), czyli 0. Dalej – bity wykładnicze to nie zera, czyli ukrytym bitem jest 1.
0 01111 0000000000 = 2 ^ 0 * ( 1 + 0 / 1.024 ) = 1
Jednak ciekawostką jest to, że zmienna Half może przechowywać dodatnie i ujemne zero:
1 00000 0000000000 = -0 0 00000 0000000000 = +0
Podsumowanie
Typ Half można także konwertować na float lub double. Z typu Half korzysta wiele obciążeń obliczeniowych – machine learning, najnowsze procesory, a także karty graficzne. W uczeniu maszynowym obliczenia korzystając ze zmniejszonej precyzji przyśpieszają kalkulację i przede wszystkim zmniejszają przestrzeń dyskową. Wiele aplikacji może zostać odblokowanych dzięki tej zmiennej. Przypuszcza się, że wkrótce typ Half będzie obsługiwał język C# jako typ danych.
Źródło: Neowin, Microsoft DevBlogs