Co to jest? · bei.pm

Ten tekst został automatycznie przetłumaczony przez OpenAI GPT-4o Mini.

W tej rubryce znajdują się artykuły na temat formatów plików i inżynierii wstecznej.

Ale jest to tak:
Jest wiele języków programowania oraz wiele osób, które znają niektóre rzeczy pod zupełnie innymi nazwami - albo nie mają pojęcia o istnieniu najbardziej podstawowych rzeczy, ponieważ ich język programowania abstrahuje to od nich.

tl;dr:
Moja notacja jest w dużej mierze oparta na C99 <stdint.h>. Kto potrafi zrozumieć tę notację, na pewno poradzi sobie z moją.

Całkowity

Liczby całkowite to po prostu liczby całkowite, czyli liczby bez części ułamkowej.

Liczby całkowite w formatach danych są zazwyczaj definiowane w ramach stałego zakresu wartości, swoistej rozdzielczości. Podaję to w bitach - ponieważ "bajt" i na jego podstawie powiązane typy (słowo, qword, ...) są zazwyczaj zależne od platformy.

Dodatkowo, w typach całkowitych rozróżnia się także liczby naturalne (ℕ, czyli liczby bez znaku - Unsigned) oraz liczby całkowite (ℤ, czyli liczby ze znakiem - Signed).
Informacja ta jest widoczna w oznaczeniu poprzez znak (u lub s).

Jest możliwe, że liczby całkowite ze znakiem mogą być przedstawiane jako kod uzupełnień do jedności lub jako kod uzupełnień do dwóch.
O ile nie zaznaczone jest inaczej, stosowane jest kod uzupełnień do dwóch, ponieważ jest on preferowaną reprezentacją w nowoczesnej informatyce.

Liczby bez znaku są w mojej dokumentacji oznaczane jako uint, z podaniem dokładności w bitach.
Liczby ze znakiem są w mojej dokumentacji oznaczane jako sint, również z podaniem dokładności w bitach.

Zrezygnowałem z użycia typu danych "char" dla znaków, ponieważ ciągi znaków zazwyczaj przedstawiają jedynie sekwencje wartości całkowitych z specjalną interpretacją.
Dlatego są one przedstawiane jako uint(8)[].

Przykłady:

Notacja C99 stdint.h-odpowiednik Opis Zakres liczb
uint(16) uint16_t Całkowita liczba bez znaku, długość 16 bitów 0 - 65.535
sint(8) int8_t Całkowita liczba ze znakiem, długość 8 bitów, dopełnienie do dwóch -126 - 127
uint(24) uint32_t:24 Całkowita liczba bez znaku, długość 24 bitów 0 - 16.777.216

Wartości z przecinkiem dziesiętnym

Liczby stałopozycyjne to wartości liczbowe z zakresu liczb wymiernych (Q), które mają zatem przecinek oraz miejsca po przecinku.

W przypadku liczb stałopozycyjnych - stąd również nazwa - pozycja przecinka jest ściśle określona przez typ danych.
Dzięki temu powstaje również ustalony zakres liczb dla tego typu danych; matematycznie rzecz ujmując, przestrzeń liczbowa jest skończona.

W praktyce ten typ danych jest głównie stosowany na platformach bez wystarczająco szybkiej jednostki sprzętowej do liczb zmiennoprzecinkowych, ponieważ obliczenia liczb stałopozycyjnych mogą być wykonywane przez jednostki całkowite.

Ten typ danych jest również używany na przykład przez systemy zarządzania bazami danych, gdy muszą być spełnione stałe wymagania.
Należy tutaj pomyśleć na przykład o systemach do trwałego przechowywania danych finansowych; większość walut ogranicza się do 2 miejsc po przecinku. (Jednak nie jest mądrze stosować tutaj liczby stałopozycyjne; lepiej jest bezpośrednio przechowywać najmniejszą jednostkę walutową jako liczbę całkowitą, a resztę pozostawić do reprezentacji)

Analogicznie do danych całkowitych, w przypadku liczb stałopozycyjnych podaję rozdzielczość liczby przed i po przecinku:
ufixed(9,7) oznacza typ danych, który rezerwuje 9 bitów na wartość przed przecinkiem oraz 7 bitów na wartość po przecinku; w sumie ma zatem szerokość 16 bitów i może na przykład jako wektor dwóch niezależnych liczb całkowitych pokryć zakres (0,0) do (511,127).
Ta interpretacja jednak w swojej dziesiętnej reprezentacji zmarnowałaby 28 liczb, ponieważ w praktyce prawdopodobnie ograniczylibyśmy się do maksymalnie (511,99).

Zamiast bezpośredniej interpretacji wartości stałopozycyjnej jako wektora z 2 oddzielnymi liczbami całkowitymi - co prawie zawsze oznaczałoby nieużywaną przestrzeń danych przy konwersji na liczby dziesiętne oraz ręczne przeniesienie - można również interpretować zakres po przecinku jako ułamek całkowitej rozdzielczości.
Na przykładzie wcześniej wspomnianego ufixed(9,7) powstaje więc ułamek o mianowniku równym 27 - zakres liczb wynosi od 0,00 do 511 + 126127 Aby przekształcić to na reprezentację dziesiętną, miejsce po przecinku należy podzielić przez 128.
Z tą wariantą łatwiej jest przeprowadzać operacje arytmetyczne, ponieważ przeniesienie zachodzi automatycznie, dzięki czemu ta wersja jest zazwyczaj preferowana.
Niemniej jednak ta wersja ma wadę, że miejsca po przecinku w reprezentacji dziesiętnej nie mają już gwarantowanej rozdzielczości, co oznacza, że pojedyncze miejsce dziesiętne nie odpowiada już wartości 0.01, lecz 0.007874, co prowadzi do odpowiednich błędów zaokrąglenia.

Jaka metoda interpretacji jest stosowana, będzie odpowiednio udokumentowana w miejscu użycia.

Wartości zmiennoprzecinkowe

Liczby zmiennoprzecinkowe to matematycznie bardziej złożone wyrażenia, w których liczba całkowita o stałej rozdzielczości jest wyrażana za pomocą wyrażenia matematycznego w taki sposób, że efektywnie część dziesiętna jest tworzona przez przesunięcie - i w ten sposób odwołuje się bezpośrednio do notacji naukowej.
Najczęściej stosowany sposób realizacji tego został ustandaryzowany w IEEE 754 i od tego czasu jest uznawany międzynarodowo.

Zazwyczaj wartość zmiennoprzecinkowa składa się z następujących komponentów:

Znaki (0 lub 1) Wykładnik Mantysa

Podczas gdy znak jako binarna informacja tak/nie może być łatwo ustalony, to sama liczba formuje się za pomocą równania
Mantysa * 2Wykładnik

Dodatkowo istnieje szereg stałych wartości, które pokrywają szczególne przypadki liczb wymiernych - w tym ±∞ oraz NaN ("brak wartości liczbowej").

Liczby zmiennoprzecinkowe są szczególnie przydatne, gdy dokładność nie jest tak ważna, ponieważ w przypadku tego typu wartości nieuchronnie dochodzi do błędów zaokrągleń, a tym samym do utraty dokładności. Zwykle wartości zmiennoprzecinkowe są stosowane na przykład do definiowania współrzędnych, takich jak wektory wierzchołków w modelach 3D lub krzywe Béziera/splajnowe do celów reprezentacji optycznej.

W formatach danych wartości zmiennoprzecinkowe są specyfikowane jako float(Mantysa, Wykładnik).
Jeśli stosowany jest format różniący się od IEEE 754, zostanie to odpowiednio zaznaczone.