Obliczenia 128-bitowe

W architekturze komputerowej 128-bitowe liczby całkowite, adresy pamięci lub inne jednostki danych to takie, które mają szerokość 128 bitów (16 oktetów). Również 128-bitowe architektury CPU i ALU to takie, które bazują na rejestrach, magistralach adresowych lub magistralach danych o tym rozmiarze.

Pomimo, że nie ma obecnie procesorów ogólnego przeznaczenia, które operowałyby na 128-bitowych liczbach całkowitych lub adresach, wiele procesorów posiada wyspecjalizowane sposoby operowania na 128-bitowych porcjach danych. Za pierwszy prosty 128-bitowy komputer można uznać IBM System/370, który wykorzystywał 128-bitowe rejestry zmiennoprzecinkowe. Większość nowoczesnych procesorów posiada zestawy instrukcji SIMD (single-instruction multiple-data) (Streaming SIMD Extensions, AltiVec itp.), w których 128-bitowe rejestry wektorowe są używane do przechowywania kilku mniejszych liczb, np. czterech 32-bitowych liczb zmiennoprzecinkowych. Pojedyncza instrukcja może wtedy operować na wszystkich tych wartościach równolegle. Jednak procesory te nie operują na pojedynczych liczbach o długości 128 cyfr binarnych; tylko ich rejestry mają rozmiar 128 bitów.

Dec VAX obsługiwał operacje na 128-bitowych liczbach całkowitych („O” lub octaword) i 128-bitowych liczbach zmiennoprzecinkowych („H-float” lub HFLOAT). Obsługa takich operacji była raczej opcją uaktualnienia niż standardową funkcją. Ponieważ rejestry VAX-a miały szerokość 32 bitów, operacja 128-bitowa wykorzystywała cztery kolejne rejestry lub cztery długie słowa w pamięci.

Seria ICL 2900 posiadała 128-bitowy akumulator, a jej zestaw instrukcji obejmował 128-bitową arytmetykę zmiennoprzecinkową i dziesiętną upakowaną.

W ten sam sposób, w jaki kompilatory emulują np. 64-bitową arytmetykę całkowitą na architekturach z rozmiarami rejestrów mniejszymi niż 64 bity, niektóre kompilatory obsługują również 128-bitową arytmetykę całkowitą. Na przykład kompilator GCC C w wersji 4.6 i nowszych ma 128-bitową liczbę całkowitą typu __int128 dla niektórych architektur. GCC i kompatybilne kompilatory sygnalizują obecność 128-bitowej arytmetyki, gdy zdefiniowane jest makro __SIZEOF_INT128__. Dla języka programowania C obsługa 128-bitów jest opcjonalna, np. poprzez typ int128_t, lub może być zaimplementowana przez specyficzne dla kompilatora rozszerzenie. Język programowania Rust ma wbudowane wsparcie dla 128-bitowych liczb całkowitych, które jest zaimplementowane na wszystkich platformach. Typ 128-bitowy dostarczony przez kompilator C może być dostępny w Perlu za pośrednictwem modułu Math::Int128.

Ewidencja 128-bitowa może przechowywać 2128 (ponad 3,40 × 1038) różnych wartości. Zakres wartości całkowitych, które mogą być przechowywane w 128 bitach, zależy od używanej reprezentacji liczby całkowitej. Przy dwóch najbardziej powszechnych reprezentacjach zakres wynosi od 0 do 340,282,366,920,938,463,463,374,607,431,768,211,455 (2128 – 1) dla reprezentacji jako (niepodpisana) liczba binarna, oraz -170,141,183,460,469,231,731,687,303,715,884,105,728 (-2127) przez 170,141,183,460,469,231,731,687,303,715,884,105,727 (2127 – 1) dla reprezentacji jako dopełnienie do dwóch.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *