Odwzorowanie liczby zmiennoprzecinkowej IEEE
Microsoft Visual C++ jest zgodne z normą IEEE numeryczne.Istnieją trzy odmiany wewnętrznego liczb rzeczywistych.Prawdziwe * 4 i prawdziwe * 8 są używane w programie Visual C++.Prawdziwe * 4 są zadeklarowane za pomocą słowa float.Prawdziwe * 8 są zadeklarowane za pomocą słowa Podwójna.W programowaniu Windows 32-bitowe, long double mapy do typu danych Podwójna.Ma jednak, obsługę języka asemblera obliczeń przy użyciu rzeczywistych * typ danych 10.
Wartości są przechowywane w następujący sposób:
Wartość |
Przechowywane jako |
---|---|
prawdziwe * 4 |
Zarejestruj bit, 8-bitowy wykładnik, mantysy 23-bitowy |
prawdziwe * 8 |
Zarejestruj bit, wykładnik 11 bit, 52 bitach mantysy |
prawdziwe * 10 |
Zarejestruj bit, wykładnik 15 bitów, mantysy 64-bitowe |
W czasie rzeczywistym * 4 i prawdziwe * 8 formatów, w który nie jest przechowywany w pamięci, więc mantissas są faktycznie 53 lub 24 bitów, mimo że są przechowywane tylko 23 lub 52 bitach mantysy jest założonej 1 wiodących.Prawdziwe * 10 format faktycznie przechowuje ten bit.
Wykładnikami obciążona są o połowę ich możliwych wartości.Oznacza to, że odjąć tego błędu z przechowywanych wykładnik uzyskanie rzeczywistej wykładnik.Jeśli wykładnik przechowywana jest mniejsza niż bias, to faktycznie ujemne wykładnik potęgi.
Wykładnikami obciążona są w następujący sposób:
Wykładnik |
Obciążona przez |
---|---|
8-bitowych (real * 4) |
127 |
11-bitowych (real * 8) |
1023 |
15-bitowych (real * 10) |
16383 |
Tych liczbach w zapisie wykładniczym nie są uprawnienia dziesięciu; są to kompetencje dwóch.Oznacza to wykładnikami przechowywanych 8-bitowych można maksymalnie 127.Wartość 2 ** 127 odpowiada mniej więcej 10 ** 38, które jest to rzeczywisty limit rzeczywistym * 4.
Mantysy jest przechowywana jako ułamek binarne formularza 1.XXX... .Ten ułamek ma wartość większą niż lub równą 1 i mniej niż 2.Należy zauważyć, że liczby rzeczywiste są zawsze przechowywane w znormalizowanej formie; to znaczy mantysy jest lewo przesunięty takie, że bit znaczących mantysy jest zawsze 1.Ponieważ ten bit jest zawsze 1, zakłada się (nie przechowywane) w rzeczywistym * 4 i prawdziwe * 8 formatów.Binarny (nie dziesiętny) punkt zakłada się, że na prawo wiodących 1.
Format, następnie, dla różnych rozmiarów jest w następujący sposób:
Formatuj |
1 BAJT |
BAJT 2 |
BAJT 3 |
4 BAJTÓW |
... |
N BAJTÓW |
---|---|---|---|---|---|---|
prawdziwe * 4 |
SXXX XXXX |
XMMM MMMM |
MMMM MMMM |
MMMM MMMM |
|
|
prawdziwe * 8 |
SXXX XXXX |
XXXX MMMM |
MMMM MMMM |
MMMM MMMM |
... |
MMMM MMMM |
prawdziwe * 10 |
SXXX XXXX |
XXXX XXXX |
1MMM MMMM |
MMMM MMMM |
... |
MMMM MMMM |
Sreprezentuje bitem znaku X's to wykładnik bitów i M's są bitach mantysy.Należy zauważyć, że po lewej stronie bit zakłada, że w czasie rzeczywistym * 4 i prawdziwe * 8 formaty, ale jest obecny jako "1" w 3 BAJTU rzeczywistych * 10 format.
Przesunięcie punktu binarne poprawnie, możesz najpierw unbias wykładnik i następnie przenieść punkt binarne w prawo lub odpowiednią liczbę bitów w lewo.
Przykłady
Oto kilka przykładów w czasie rzeczywistym * 4, format:
W poniższym przykładzie bitem znaku jest zero, a przechowywana wykładnik jest 128 lub 100 0000 0 w formacie binarnym, który jest 127 plus 1.Mantysy przechowywana jest (1.) 000 0000... 0000 do 0000, który ma wprost wiodących 1 i binarne punktu, więc rzeczywisty mantysy jest jeden.
SXXX XXXX XMMM MMMM ... MMMM MMMM 2 = 1 * 2**1 = 0100 0000 0000 0000 ... 0000 0000 = 4000 0000
Taki sam jak + 2, z tym wyjątkiem, że ustawiony jest bitem znaku.Ta zasada obowiązuje dla wszystkich liczb zmiennoprzecinkowych format IEEE.
-2 = -1 * 2**1 = 1100 0000 0000 0000 ... 0000 0000 = C000 0000
Sam mantysy wykładnik zwiększa się o jeden (wartość obciążonej jest 129 lub 100 0000 1 w formacie binarnym.
4 = 1 * 2**2 = 0100 0000 1000 0000 ... 0000 0000 = 4080 0000
Sam wykładnik mantysy jest większy o połowę — to (1.) 100 0000...0000 do 0000, który, ponieważ jest to ułamek binarne jest 1 1/2 (wartości ułamkowe cyfr są 1/2, 1/4, 1/8 i tak dalej).
6 = 1.5 * 2**2 = 0100 0000 1100 0000 ... 0000 0000 = 40C0 0000
Wykładnik sam jako inne uprawnienia mantysy dwóch, znajduje się mniej niż dwa w 127 lub 011 1111 1 w formacie binarnym.
1 = 1 * 2**0 = 0011 1111 1000 0000 ... 0000 0000 = 3F80 0000
Wykładnik obciążonej jest 126, 011 1111 0 w binarnych i mantysy jest (1.) 100 0000... 0000 do 0000, czyli 1 1/2.
.75 = 1.5 * 2**-1 = 0011 1111 0100 0000 ... 0000 0000 = 3F40 0000
Dokładnie tak samo jak dwa chyba że reprezentujący 1/4 w jest ustawiony bit mantysy.
2.5 = 1.25 * 2**1 = 0100 0000 0010 0000 ... 0000 0000 = 4020 0000
1/10 to ułamek powtarzanej w formacie binarnym.Mantysy jest po prostu nieśmiały 1.6 i obciążonej wykładnik mówi, że 1.6 należy podzielić przez 16 (jest to 1 1101 011 w formacie binarnym, który jest 123 w zapisie dziesiętnym).Wykładnik PRAWDA jest 123-127 = 4, co oznacza, że współczynnik mnożenia wynosi 2 ** 4 = 1/16.Należy zauważyć, że mantysy przechowywana jest zaokrąglana w górę w ostatnio trochę — próba reprezentują unrepresentable numer tak dokładnie, jak to możliwe. (Przyczyna 1: 10 i 1/100 są nie do końca reprezentowanych w formacie binarnym jest podobne do przyczyny 1/3 jest nie do końca reprezentowanych w zapisie dziesiętnym.)
0.1 = 1.6 * 2**-4 = 0011 1101 1100 1100 ... 1100 1101 = 3DCC CCCD
0 = 1.0 * 2**-128 = all zeros--a special case.