W informatyce , IEEE 754 jest standardem zmiennoprzecinkowych arytmetycznych opracowany przez Institute of Electrical and Electronics Engineers . Obecnie jest to najpowszechniej stosowany standard obliczania liczb zmiennoprzecinkowych z procesorami CPU i FPU . Norma definiuje formaty reprezentacji liczb zmiennoprzecinkowych ( znak , mantysa , wykładnik , liczby zdenormalizowane ) oraz wartości specjalne ( nieskończone i NaN ), wraz z zestawem operacji zmiennoprzecinkowych. Opisuje również pięć trybów zaokrąglania i pięć wyjątków (w tym warunki, w których występuje wyjątek i co się dzieje w takim przypadku).
Oryginalna wersja IEEE 754, pochodząca z 1985 roku, definiowała cztery formaty reprezentacji liczb zmiennoprzecinkowych o podstawie 2:
Na przykład w języku C kompilator gcc dla 32-bitowych architektur zgodnych z Intelem używa pojedynczej precyzji formatu dla zmiennych typu float , podwójnej precyzji dla zmiennych typu double i podwójnej precyzji lub rozszerzonej podwójnej precyzji (zgodnie z systemem operacyjnym) dla długich podwójnych zmiennych . Jeśli jednak rozszerzenie SSE2 nie jest używane, wszystkie obliczenia są zaokrąglane z tą samą precyzją, w zależności od dynamicznego ustawienia precyzji procesora (zazwyczaj podwójna precyzja lub rozszerzona podwójna precyzja, w zależności od systemu operacyjnego, opcji kompilacji i zmian wprowadzonych przez programy).
Pełny tytuł standardu brzmiał: IEEE Standard for Binary Floating-Point Arithmetic (ANSI / IEEE Std 754-1985 ). Jest również znany pod nazwą IEC 60559: 1989, Binarna arytmetyka zmiennoprzecinkowa dla systemów mikroprocesorowych , co również czyni go standardem (amerykańskim), ponieważ został zatwierdzony jako odniesienie normatywne w kilku międzynarodowych normach ISO. Jednak standard ten został rozszerzony przez poważną zmianę w 2008 r. Na inne podstawowe formaty (binarne na 128 bitach i dziesiętne na 64 i 128 bitach), a także formaty wymiany (dodanie formatów, które są albo mniej dokładne lub bardziej precyzyjne) i rozszerzone formaty ( uogólnienie standardu z 1985 r., z większą swobodą w zakresie precyzji i kodowania niż w przypadku formatów wymiany); ta wersja zawiera również dodatkowe tryby zaokrąglania i bardziej rygorystyczne wymagania zgodności dotyczące oczekiwanej dokładności podstawowych operacji i obliczeń funkcji transcendentalnych. Ten standard również został zmieniony w 2019 roku.
W słowo o długości W, bity są indeksowane od 0 do W - 1 włącznie. Bit 0 jest umieszczony po prawej stronie i reprezentuje najmniej znaczący bit (to znaczy bit jednostek, który spowoduje najmniejszą zmianę, jeśli zostanie zmieniony).
Liczba zmiennoprzecinkowa składa się z trzech elementów: mantysy , wykładnika i znaku. Najbardziej znaczącym bitem jest bit znaku : jeśli ten bit ma wartość 1, liczba jest ujemna, a jeśli wynosi 0, liczba jest dodatnia. Następne e bity reprezentują obciążony wykładnik (z wyjątkiem wartości specjalnej), a następne m bitów ( m najmniej znaczących bitów) reprezentują mantysę.
Znak | Wykładnik odchylenia | Mantysa |
(1 bit) | ( E bitów) | ( m bitów) |
Wykładnik może być dodatni lub ujemny. Jednak zwykłe przedstawienie liczb ze znakiem ( uzupełnienie do 2 ) utrudniłoby nieco porównanie liczb zmiennoprzecinkowych. Aby rozwiązać ten problem, wykładnik jest „pochylony”, aby zapisać go jako liczbę bez znaku.
To odchylenie wynosi 2 e −1 - 1 ( e oznacza liczbę bitów w wykładniku); jest więc wartością stałą po ustaleniu liczby bitów e .
Interpretacja liczby (innej niż nieskończoność) jest zatem następująca: wartość = znak × mantysa × 2 ( wykładnik - odchylenie ) z
Najbardziej znaczący kawałek mantysy jest określony przez wartość wykładnika obciążonego. Jeśli odchylony wykładnik jest różny od 0 i od , najbardziej znaczący bit mantysy ma wartość 1, a liczba jest określana jako „znormalizowana”. Jeśli odchylony wykładnik wynosi zero, najbardziej znaczący bit mantysy wynosi zero, a liczba jest zdenormalizowana .
Istnieją trzy szczególne przypadki:
Możemy to podsumować następująco:
Rodzaj | Wykładnik odchylenia | Mantysa |
---|---|---|
Zera | 0 | 0 |
Liczby zdenormalizowane | 0 | różny od 0 |
Znormalizowane liczby | w | każdy |
Nieskończony | 0 | |
NaNs | różny od 0 |
Liczba zmiennoprzecinkowa o pojedynczej precyzji jest przechowywana w 32-bitowym słowie : 1 bit znaku, 8 bitów dla wykładnika i 23 dla mantysy.
Wykładnik jest więc w tym przypadku obciążony . Dlatego wykładnik znormalizowanej liczby wynosi od -126 do +127. Wykładnik -127 (który jest przesunięty w kierunku wartości 0) jest zarezerwowany dla liczb zerowych i zdenormalizowanych, podczas gdy wykładnik 128 (przesunięty w kierunku 255) jest zarezerwowany do kodowania nieskończoności i NaN (patrz poprzednia tabela).
Znormalizowana liczba zmiennoprzecinkowa ma wartość v określoną według następującego wzoru:
v = s × 2 e × m .Na przykład dla 0b 0 01111100 01000000000000000000000: znak jest dodatni, wykładnik to 124 - 127 = −3, a część znacząca to 0b 1,01, czyli 1,25 dziesiętnie (1 × 2 0 + 0 × 2 −1 + 1 × 2 - 2 ); reprezentowana liczba to zatem +1,25 × 2 −3 lub +0,15625.
Nieznormalizowaną numery zgodnie z tą samą zasadą, oprócz tego, że e = -126 i m = 0+ mantysa (uwaga: dla obliczeń, zadbamy wziąć e = -126 i -127 nie, w celu zapewnienia ciągłości tego reprezentacja ze znormalizowaną reprezentacją, ponieważ m = 0+ mantysa i już nie m = 1+ mantysa ).
Uwagi:
Oto tabela podsumowująca poprzednią część, z przykładami 32-bitowych liczb o pojedynczej precyzji.
Rodzaj | Wystawca | Mantysa | Przybliżona wartość | Odchylenie / poprz |
---|---|---|---|---|
Zero | 0000 0000 | 000 0000 0000 0000 0000 0000 | 0.0 | |
Najmniejsza zdenormalizowana liczba | 0000 0000 | 000 0000 0000 0000 0000 0001 | 1,4 x 10 −45 | 1,4 x 10 −45 |
Następna zdenormalizowana liczba | 0000 0000 | 000 0000 0000 0000 0000 0010 | 2,8 x 10 −45 | 1,4 x 10 −45 |
Następna zdenormalizowana liczba | 0000 0000 | 000 0000 0000 0000 0000 0011 | 4,2 x 10-45 | 1,4 x 10 −45 |
Inna liczba zdenormalizowana | 0000 0000 | 100 0000 0000 0000 0000 0000 | 5,9 x 10 −39 | |
Największa zdenormalizowana liczba | 0000 0000 | 111 1111 1111 1111 1111 1111 | 1,175 494 21 × 10 −38 | |
Najmniejsza znormalizowana liczba | 0000 0001 | 000 0000 0000 0000 0000 0000 | 1,175 494 35 × 10 −38 | 1,4 x 10 −45 |
Następny znormalizowany numer | 0000 0001 | 000 0000 0000 0000 0000 0001 | 1,175 494 49 × 10 −38 | 1,4 x 10 −45 |
Prawie podwójnie | 0000 0001 | 111 1111 1111 1111 1111 1111 | 2.350 988 56 × 10 −38 | 1,4 x 10 −45 |
Następny znormalizowany numer | 0000 0010 | 000 0000 0000 0000 0000 0000 | 2.350 988 70 × 10 −38 | 1,4 x 10 −45 |
Następny znormalizowany numer | 0000 0010 | 000 0000 0000 0000 0000 0001 | 2.350 988 98 × 10 −38 | 2,8 x 10 −45 |
Prawie 1 | 0111 1110, | 111 1111 1111 1111 1111 1111 | 0,999 999 94 | 0,6 × 10 −7 |
1 | 0111 1111 | 000 0000 0000 0000 0000 0000 | 1,000,000 00 | |
Następny numer 1 | 0111 1111 | 000 0000 0000 0000 0000 0001 | 1000000 12 | 1,2 x 10 −7 |
Prawie największa liczba | 1111 1110, | 111 1111 1111 1111 1111 1110 | 3.402 823 26 × 10 38 | |
Największa znormalizowana liczba | 1111 1110, | 111 1111 1111 1111 1111 1111 | 3.402 823 46 × 10 38 | 2 × 10 31 |
Nieskończony | 1111 1111, | 000 0000 0000 0000 0000 0000 | Nieskończony | |
Pierwsza (zdenormalizowana) wartość ostrzeżenia NaN | 1111 1111, | 000 0000 0000 0000 0000 0001 | nie | |
Znormalizowany NaN (alarm) | 1111 1111, | 010 0000 0000 0000 0000 0000 | nie | |
Ostatnia (zdenormalizowana) wartość ostrzeżenia NaN | 1111 1111, | 011 1111 1111 1111 1111 1111 | nie | |
Pierwsza (zdenormalizowana) wartość cichego NaN | 1111 1111, | 100 0000 0000 0000 0000 0000 | nie | |
Ostatnia (zdenormalizowana) wartość cichego NaN | 1111 1111, | 111 1111 1111 1111 1111 1111 | nie |
Uwagi:
Zakodujmy liczbę dziesiętną −118,625 przy użyciu mechanizmu IEEE 754.
Mamy zatem −118,625 (dec) = 1100 0010 1110 1101 0100 0000 0000 0000 (bin) = C2ED4000 (hexa).
Format podwójnej precyzji jest taki sam, jak pojedynczej precyzji, z tą różnicą, że pola są większe. Rzeczywiście, ma 52 bity mantysy zamiast tylko 23 i 11 bitów wykładnika zamiast tylko 8.
Mantysa jest bardzo szeroka, a wykładnik niezbyt szeroki. Dzieje się tak, ponieważ według twórców standardu precyzja jest ważniejsza niż amplituda.
NaN i nieskończoności są reprezentowane przez ustawienie wszystkich bitów wykładnika na 1 (2047), ale rozróżniane przez ustawienie wszystkich 52 bitów mantysy na 0 dla nieskończoności i co najmniej jeden z tych 52 bitów na 1 dla Nie .
W przypadku liczb znormalizowanych odchylenie wykładnika wynosi +1023. W przypadku liczb zdenormalizowanych wykładnik wynosi −1022 (minimalny wykładnik dla liczby znormalizowanej). Nie jest to −1023, ponieważ znormalizowane liczby mają 1 przed przecinkiem, a zdenormalizowane nie. Tak jak poprzednio, zero i nieskończoność są podpisane.
Uwagi:
Generalnie najlepiej jest porównywać liczby zmiennoprzecinkowe przy użyciu instrukcji obliczeń zmiennoprzecinkowych. Jednak ta reprezentacja umożliwia porównywanie pewnych podzbiorów bajt po bajcie, jeśli mają one tę samą kolejność bajtów i ten sam znak, a NaN są wykluczone.
Na przykład dla dwóch dodatnich liczb zmiennoprzecinkowych a i b porównanie między a i b (>, <lub ==) daje takie same wyniki, jak porównanie dwóch liczb ze znakiem (lub bez znaku) o takich samych bitach jak a i b. Innymi słowy, dwie dodatnie liczby zmiennoprzecinkowe (które nie są NaN) można porównać z porównaniem binarnym ze znakiem (lub bez znaku). Ze względu na problem z kolejnością bajtów tego porównania nie można używać w kodzie przenośnym.
Standard IEEE określa 5 trybów zaokrąglania:
W czerwiec 2008, poważna zmiana standardów IEEE 754 i IEEE 854 została zatwierdzona przez IEEE. Zobacz: IEEE 754-2008 (en) .
Ta wersja wprowadza nowe formaty o podstawie 2 i 10 oraz określa reprezentację formatów o podstawie 10 (oprócz formatu podstawowego 2).
Normalizuje również całkowitą relację porządku dla każdego znormalizowanego liczbowego typu danych, uzupełniając zwykłe relacje porządku, które są tylko częściowe; w rzeczywistości relacja normalnego rzędu jest całkowita tylko pod warunkiem usunięcia ze zbioru wartości ujemnej wartości zerowej (zwykle porównywana jako równa dodatniej wartości zerowej) i wszystkich wartości NaN (które nie są ani równe, ani wyższe, ani nie są gorsze od innych, nawet samych siebie).
Z drugiej strony, ta rewizja pozostawia elastyczność reprezentacji i możliwe rozróżnienie wartości NaN (pozycja i wartość bitów ostrzegawczych w polu mantysy nie są znormalizowane, a użycie innych bitów pole mantysy lub znak wartości NaN do zakodowania błędu pozostaje zależny od architektury lub aplikacji).
Nowa wersja została zatwierdzona w lipiec 2019.