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.
Ciąg binarny | Wartość ósemkowa |
---|---|
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
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
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ż
- Arytmetyka z dowolną precyzją
- Dziesiętne kodowane binarnie
- Binarny system liczbowy
- Kod szary
- System liczbowy
Uwagi i odniesienia
Pierwsza wersja tego artykułu została oparta na artykule z domeny publicznej z Wektory Grega Goebela .