Format liczb komputerowych - Computer number format

Format numeru komputer jest wewnętrzna reprezentacja wartości liczbowych w formie sprzętu i oprogramowania urządzenia, takie jak programowalnych komputerów i kalkulatorów . Wartości liczbowe są przechowywane w postaci grup bitów , takich jak bajty i słowa. Kodowanie pomiędzy wartościami numerycznymi a wzorami bitowymi jest wybrane ze względu na wygodę obsługi komputera; kodowanie używane w zestawie instrukcji komputera zazwyczaj wymaga konwersji do użytku zewnętrznego, takiego jak drukowanie i wyświetlanie. Różne typy procesorów mogą mieć różne wewnętrzne reprezentacje wartości liczbowych, a dla liczb całkowitych i rzeczywistych stosowane są różne konwencje. Większość obliczeń jest wykonywana przy użyciu formatów liczb, które mieszczą się w rejestrze procesora, ale niektóre systemy oprogramowania umożliwiają reprezentację dowolnie dużych liczb przy użyciu wielu słów pamięci.

Reprezentacja liczb binarnych

Komputery przedstawiają dane w zestawach cyfr binarnych. Reprezentacja składa się z bitów, które z kolei są pogrupowane w większe zbiory, takie jak bajty.

Tabela 1: Binarny na ósemkowy
Ciąg binarny Wartość ósemkowa
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
Tabela 2: Liczba wartości dla ciągu bitowego.
Długość ciągu bitów (b) Liczba możliwych wartości (N)
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1024
...

Bit jest binarny cyfra , która reprezentuje jeden z dwóch stanów . Pojęcie bitu można rozumieć jako wartość 1 lub 0 , włączone lub wyłączone , tak lub nie , prawda lub fałsz , albo zakodowane za pomocą jakiegoś przełącznika lub przełącznika .

Podczas gdy pojedynczy bit może sam w sobie reprezentować tylko dwie wartości, do reprezentowania większych wartości można użyć ciągu bitów . Na przykład ciąg trzech bitów może reprezentować do ośmiu różnych wartości, jak pokazano w tabeli 1.

Wraz ze wzrostem liczby bitów tworzących ciąg, liczba możliwych kombinacji 0 i 1 rośnie wykładniczo . Pojedynczy bit dopuszcza tylko dwie kombinacje wartości, dwa bity połączone mogą dać cztery oddzielne wartości, trzy bity dla ośmiu itd., Zwiększając za pomocą wzoru 2 ^ n. Liczba możliwych kombinacji podwaja się po dodaniu każdej cyfry binarnej, jak pokazano w Tabeli 2.

Grupy z określoną liczbą bitów służą do reprezentowania różnych rzeczy i mają określone nazwy.

Bajt jest ciągiem nieco zawierający liczbę bitów potrzebnych do reprezentowania charakter . Na większości nowoczesnych komputerów jest to ośmiobitowy ciąg. Ponieważ definicja bajtu jest związana z liczbą bitów składających się na znak, niektóre starsze komputery używały innej długości bitu dla swojego bajtu. W wielu architekturach komputerowych bajt jest najmniejszą adresowalną jednostką , powiedzmy atomem adresowalności. Na przykład, nawet jeśli procesory 64-bitowe mogą adresować pamięć do sześćdziesięciu czterech bitów naraz, mogą nadal dzielić tę pamięć na ośmiobitowe części. Nazywa się to pamięcią adresowalną bajtowo. Historycznie rzecz biorąc, wiele procesorów odczytuje dane w wielokrotności ośmiu bitów. Ponieważ rozmiar bajtów ośmiu bitów jest tak powszechny, ale definicja nie jest znormalizowana, termin oktet jest czasami używany do wyraźnego opisu sekwencji ośmiobitowej.

Dziobanie (czasami nybble ) szereg złożony z czterech bitów. Będąc pół-bajtowym , skubacz został nazwany grą słów. Osoba może potrzebować kilku przekąsek na jedno ugryzienie czegoś; podobnie, nybble jest częścią bajtu. Ponieważ cztery bity pozwalają na szesnaście wartości, półbajt jest czasami nazywany cyfrą szesnastkową .

Wyświetlanie liczb ósemkowych i szesnastkowych

Kodowanie ósemkowe i szesnastkowe to wygodne sposoby reprezentowania liczb binarnych, tak jak są one używane na komputerach. Inżynierowie komputerowi często muszą zapisywać wielkości binarne, ale w praktyce zapisanie liczby binarnej, takiej jak 1001001101010001, jest żmudne i podatne na błędy. Dlatego wielkości binarne są zapisywane w formacie liczbowym o podstawie 8 lub „ósemkowej” lub, znacznie częściej, w formacie szesnastkowym ( szesnastkowym ) z podstawą 16 . W systemie dziesiętnym jest 10 cyfr od 0 do 9, które razem tworzą liczby. W systemie ósemkowym jest tylko 8 cyfr, od 0 do 7. Oznacza to, że wartość ósemkowej „10” jest taka sama, jak dziesiętna „8”, ósemkowa „20” to dziesiętna „16”, i tak na. W systemie szesnastkowym jest 16 cyfr, od 0 do 9, po których jest umownie od A do F. Oznacza to, że szesnastkowa „10” to to samo, co dziesiętna „16”, a szesnastkowa „20” to to samo, co dziesiętne „32”. Przykład i porównanie liczb w różnych bazach opisano w poniższej tabeli.

Podczas wpisywania liczb do opisu systemu liczbowego używane są znaki formatujące, na przykład 000_0000B lub 0b000_00000 dla liczb binarnych i 0F8H lub 0xf8 dla liczb szesnastkowych.

Konwersja między zasadami

Tabela 3: Porównanie wartości w różnych bazach
Dziesiętny Dwójkowy Ósemkowe Szesnastkowy
0 000000 00 00
1 000001 01 01
2 000010 02 02
3 000011 03 03
4 000100 04 04
5 000101 05 05
6 000110 06 06
7 000111 07 07
8 001000 10 08
9 001001 11 09
10 001010 12 0A
11 001011 13 0B
12 001100 14 0C
13 001101 15 0D
14 001110 16 0E
15 001111 17 0F

Każdy z tych systemów liczbowych jest systemem pozycyjnym, ale podczas gdy wagi dziesiętne to potęgi 10, wagi ósemkowe to potęgi 8, a wagi szesnastkowe to potęgi 16. Aby dokonać konwersji z szesnastkowego lub ósemkowego na dziesiętny, dla każdej cyfry jeden mnoży wartość cyfry o wartość jej pozycji, a następnie dodaje wyniki. Na przykład:

Reprezentowanie ułamków w systemie dwójkowym

Liczby stałoprzecinkowe

Formatowanie stałoprzecinkowe może być przydatne do reprezentowania ułamków w formacie binarnym.

Aby przechowywać części ułamkowe i całkowite liczby, należy wybrać liczbę bitów potrzebną do uzyskania żądanej precyzji i zakresu. Na przykład, używając formatu 32-bitowego, 16 bitów może być użytych dla liczby całkowitej, a 16 dla ułamka.

Po bicie ósemki następuje bit czwórki, potem bit dwójki, a potem bit jedynki. Ułamkowe bity kontynuują wzorzec określony przez bity całkowite. Następny bit to połowa, potem ćwiartka, potem ⅛ i tak dalej. Na przykład:

bity całkowite ułamkowe bity
0,500 = 1 / 2 = 00000000 00000000.10000000 00000000
1.250 = 1 + 1 / 4 = 00000000 00000001.01000000 00000000
7.375 = 7 + 3 / 8 = 00000000 00000111.01100000 00000000

Ta forma kodowania nie może reprezentować niektórych wartości w postaci binarnej. Na przykład ułamek 1 / 5 , 0,2 w systemie dziesiętnym, najbliższe przybliżenia wyglądałyby następująco:

13107/65536 = 00000000 00000000.00110011 00110011 = 0,1999969 ... dziesiętnie
13108/65536 = 00000000 00000000.00110011 00110100 = 0,2000122 ... dziesiętnie

Nawet jeśli użyto większej liczby cyfr, dokładna reprezentacja jest niemożliwa. Numer 1 / 3 , zapisany dziesiętnie jako 0,333333333 ..., kontynuuje się przez czas nieokreślony. W przypadku przedwczesnego zakończenia wartość nie będzie reprezentować 1 / 3 dokładnie.

Liczb zmiennoprzecinkowych

Podczas gdy w systemach cyfrowych używane są zarówno liczby całkowite bez znaku, jak i ze znakiem, nawet 32-bitowe liczby całkowite nie wystarczą, aby obsłużyć cały zakres liczb, które może obsłużyć kalkulator, a to nawet nie obejmuje ułamków. Aby przybliżyć większy zakres i dokładność liczb rzeczywistych , musimy porzucić liczby całkowite ze znakiem i liczby stałoprzecinkowe i przejść do formatu „ zmiennoprzecinkowego ”.

W systemie dziesiętnym są nam znane liczby zmiennoprzecinkowe postaci ( notacja naukowa ):

1,1030402 × 10 5 = 1,1030402 × 100000 = 110304.02

lub bardziej zwięźle:

1.1030402E5

co oznacza „1,1030402 razy 1, po którym następuje 5 zer”. Mamy pewną wartość liczbową (1.1030402), znany jako „ mantysy ”, pomnożona przez moc 10 (E5, co oznacza 10 5 lub 100,000), znany jako „ wykładnik ”. Jeśli mamy ujemny wykładnik, oznacza to, że liczba jest pomnożona przez 1 o wiele miejsc na prawo od przecinka dziesiętnego. Na przykład:

2,3434E − 6 = 2,3434 × 10 −6 = 2,3434 × 0,000001 = 0,0000023434

Zaletą tego schematu jest to, że używając wykładnika możemy uzyskać znacznie szerszy zakres liczb, nawet jeśli liczba cyfr w mantyście, czyli „dokładność numeryczna”, jest znacznie mniejsza niż zakres. Podobne binarne formaty zmiennoprzecinkowe można zdefiniować dla komputerów. Takich schematów jest kilka, najpopularniejszy został zdefiniowany przez Instytut Inżynierów Elektryków i Elektroników (IEEE). IEEE 754-2008 standardowy opis określa 64 bitowy format zmiennoprzecinkową z:

  • 11-bitowy wykładnik binarny w formacie „nadmiar-1023”. Nadmiar-1023 oznacza, że ​​wykładnik występuje jako binarna liczba całkowita bez znaku od 0 do 2047; odjęcie 1023 daje rzeczywistą wartość ze znakiem
  • 52-bitowy znacznik, również liczba binarna bez znaku, określająca wartość ułamkową z początkową implikowaną liczbą „1”
  • znak bitu, podając znak liczby.

Zobaczmy, jak wygląda ten format, pokazując, jak taka liczba byłaby przechowywana w 8 bajtach pamięci:

bajt 0 S x10 x9 x8 x7 x6 x5 x4
bajt 1 x3 x2 x1 x0 m51 m50 m49 m48
bajt 2 m47 m46 m45 m44 m43 m42 m41 m40
bajt 3 m39 m38 m37 m36 m35 m34 m33 m32
bajt 4 m31 m30 m29 m28 m27 m26 m25 m24
bajt 5 m23 m22 m21 m20 m19 m18 m17 m16
bajt 6 m15 m14 m13 m12 m11 m10 m9 m8
bajt 7 m7 m6 m5 m4 m3 m2 m1 m0

gdzie „S” oznacza bit znaku, „x” oznacza bit wykładnika, a „m” oznacza bit istotności. Po wyodrębnieniu tutaj bitów są one konwertowane za pomocą obliczenia:

<sign> × (1 + <ułamkowa istotność>) × 2 <wykładnik> - 1023

Ten schemat zapewnia liczby ważne do około 15 cyfr dziesiętnych, z następującym zakresem liczb:

maksymalny minimum
pozytywny 1.797693134862231E + 308 4.940656458412465E-324
negatywny -4,940656458412465E-324 -1,797693134862231E + 308

Specyfikacja definiuje również kilka specjalnych wartości, które nie są zdefiniowanymi liczbami i są znane jako NaN dla „Not A Number”. Są one używane przez programy do oznaczania nieprawidłowych operacji i tym podobnych.

Niektóre programy używają również 32-bitowych liczb zmiennoprzecinkowych. Najpopularniejszy schemat wykorzystuje 23-bitową wartość znaczącą z bitem znaku oraz 8-bitowym wykładnikiem w formacie „nadmiar-127”, co daje siedem prawidłowych cyfr dziesiętnych.

bajt 0 S x7 x6 x5 x4 x3 x2 x1
bajt 1 x0 m22 m21 m20 m19 m18 m17 m16
bajt 2 m15 m14 m13 m12 m11 m10 m9 m8
bajt 3 m7 m6 m5 m4 m3 m2 m1 m0

Bity są konwertowane na wartość liczbową za pomocą obliczenia:

<znak> × (1 + <ułamek istotności>) × 2 <wykładnik> - 127

prowadzące do następującego zakresu liczb:

maksymalny minimum
pozytywny 3.402823E + 38 2,802597E-45
negatywny -2,802597E-45 -3,402823E + 38

Takie liczby zmiennoprzecinkowe nazywane są ogólnie „liczbami rzeczywistymi” lub „zmiennoprzecinkowymi”, ale z kilkoma odmianami:

32-bitowa wartość zmiennoprzecinkowa jest czasami nazywana „real32” lub „pojedynczą”, co oznacza „wartość zmiennoprzecinkową o pojedynczej precyzji”.

64-bitowy zmiennoprzecinkowy jest czasami nazywany „real64” lub „double”, co oznacza „wartość zmiennoprzecinkową podwójnej precyzji”.

Relacja między liczbami a wzorami bitowymi jest wybrana dla wygody w manipulacji komputerowej; osiem bajtów przechowywanych w pamięci komputera może reprezentować 64-bitową liczbę rzeczywistą, dwie 32-bitowe wartości rzeczywiste, cztery liczby całkowite ze znakiem lub bez znaku lub inny rodzaj danych mieszczących się w ośmiu bajtach. Jedyną różnicą jest sposób ich interpretacji przez komputer. Gdyby komputer zapisał cztery liczby całkowite bez znaku, a następnie odczytał je z pamięci jako 64-bitową liczbę rzeczywistą, prawie zawsze byłaby to całkowicie poprawna liczba rzeczywista, chociaż byłyby to niepotrzebne dane.

Za pomocą danej liczby bitów można przedstawić tylko skończony zakres liczb rzeczywistych. Operacje arytmetyczne mogą powodować przepełnienie lub niedomiar, powodując powstanie wartości zbyt dużej lub zbyt małej, aby można ją było przedstawić.

Przedstawienie ma ograniczoną precyzję. Na przykład tylko 15 cyfr dziesiętnych można przedstawić za pomocą 64-bitowej liczby rzeczywistej. Jeśli bardzo mała liczba zmiennoprzecinkowa zostanie dodana do dużej, wynikiem będzie tylko duża liczba. Mała liczba była zbyt mała, aby pojawić się nawet w 15 lub 16 cyfrach rozdzielczości, a komputer skutecznie ją odrzuca. Analiza wpływu ograniczonej precyzji jest dobrze zbadanym problemem. Szacunki wielkości błędów zaokrągleń i metody ograniczania ich wpływu na duże obliczenia są częścią każdego dużego projektu obliczeniowego. Granica dokładności różni się od granicy zakresu, ponieważ wpływa na istotność, a nie na wykładnik.

Znaczenie to ułamek binarny, który niekoniecznie idealnie pasuje do ułamka dziesiętnego. W wielu przypadkach suma wzajemnych potęg wynosząca 2 nie odpowiada określonej wartości ułamka dziesiętnego, a wyniki obliczeń będą nieco nieprawidłowe. Na przykład ułamek dziesiętny „0,1” odpowiada nieskończenie powtarzającemu się ułamkowi dwójkowemu: 0,000110011 ...

Liczby w językach programowania

Programowanie w języku asemblerowym wymaga od programisty śledzenia reprezentacji liczb. W przypadku gdy procesor nie obsługuje wymaganej operacji matematycznej, programista musi opracować odpowiedni algorytm i sekwencję instrukcji, aby wykonać operację; na niektórych mikroprocesorach nawet mnożenie liczb całkowitych musi być wykonywane w oprogramowaniu.

Języki programowania wysokiego poziomu , takie jak Ruby i Python, oferują abstrakcyjną liczbę, która może być rozszerzonym typem, takim jak racjonalny , bignum lub złożony . Operacje matematyczne są wykonywane przez procedury biblioteczne zapewnione przez implementację języka. Dany symbol matematyczny w kodzie źródłowym, przez przeciążenie operatora , wywoła inny kod obiektowy odpowiedni do reprezentacji typu liczbowego; operacje matematyczne na dowolnej liczbie - ze znakiem, bez znaku, wymierne, zmiennoprzecinkowe, stałoprzecinkowe, całkowe lub zespolone - są zapisywane dokładnie w ten sam sposób.

Niektóre języki, takie jak REXX i Java , udostępniają dziesiętne operacje zmiennoprzecinkowe, które zapewniają zaokrąglanie błędów o innej postaci.

Zobacz też

Uwagi i odniesienia

Pierwsza wersja tego artykułu została oparta na artykule z domeny publicznej z Wektory Grega Goebela .