Jaka jest różnica między operacją zmiennoprzecinkową o pojedynczej precyzji a operacją zmiennoprzecinkową o podwójnej precyzji?
Szczególnie interesują mnie kwestie praktyczne związane z konsolami do gier wideo. Na przykład, czy Nintendo 64 ma procesor 64-bitowy, a jeśli tak, czy to znaczy, że jest zdolny do wykonywania operacji zmiennoprzecinkowych o podwójnej precyzji? Czy PS3 i Xbox 360 mogą wykonywać operacje zmiennoprzecinkowe podwójnej precyzji, czy tylko pojedynczą precyzję, a w ogólnym użyciu są wykorzystywane możliwości podwójnej precyzji (jeśli istnieją?).
floating-point
precision
processor
operations
tweetypi
źródło
źródło
Odpowiedzi:
Uwaga: Nintendo 64 ma 64-bitowy procesor, jednak:
Z Webopedia :
Format podwójnej precyzji IEEE ma w rzeczywistości ponad dwa razy więcej bitów precyzji niż format pojedynczej precyzji, a także znacznie większy zakres.
Ze standardu IEEE dla arytmetyki zmiennoprzecinkowej
Pojedyncza precyzja
Standardowa reprezentacja zmiennoprzecinkowa pojedynczej precyzji IEEE wymaga 32-bitowego słowa, które może być reprezentowane jako ponumerowane od 0 do 31, od lewej do prawej.
ostatnie 23 bity to ułamek „F”:
Wartość V reprezentowaną przez słowo można określić następująco:
0<E<255
wtedy,V=(-1)**S * 2 ** (E-127) * (1.F)
gdzie „1.F” ma reprezentować liczbę binarną utworzoną przez przedrostek F z niejawną wiodącą 1 i punktem binarnym.V=(-1)**S * 2 ** (-126) * (0.F)
. Są to wartości „nieznormalizowane”.W szczególności,
Podwójna precyzja
Standardowa reprezentacja zmiennoprzecinkowa podwójnej precyzji IEEE wymaga 64-bitowego słowa, które może być przedstawione jako ponumerowane od 0 do 63, od lewej do prawej.
ostatnie 52 bity to ułamek „F”:
Wartość V reprezentowaną przez słowo można określić następująco:
0<E<2047
wtedy,V=(-1)**S * 2 ** (E-1023) * (1.F)
gdzie „1.F” ma reprezentować liczbę binarną utworzoną przez przedrostek F z niejawną wiodącą 1 i punktem binarnym.V=(-1)**S * 2 ** (-1022) * (0.F)
są to wartości „nieznormalizowane”.Odniesienie:
Norma ANSI / IEEE 754-1985,
Standard binarnej arytmetyki zmiennoprzecinkowej.
źródło
**
' to potęgowanieCzytałem wiele odpowiedzi, ale żadna nie wydaje się poprawnie wyjaśniać, skąd pochodzi słowo podwójne . Pamiętam bardzo dobre wyjaśnienie, jakiego udzielił mi profesor Uniwersytetu, którego miałem kilka lat temu.
Przypominając styl odpowiedzi VonC, reprezentacja zmiennoprzecinkowa pojedynczej precyzji wykorzystuje słowo 32-bitowe.
Reprezentacja:
(Żeby zaznaczyć, znak jest ostatnim, a nie pierwszym).
Podwójna precyzja floating point reprezentacji używa słowa 64 bitów.
Reprezentacja:
Jak możesz zauważyć, napisałem, że mantysa ma w obu typach nieco więcej informacji w porównaniu z jej reprezentacją. W rzeczywistości mantysa jest liczbą reprezentowaną bez jej znaczenia
0
. Na przykład,Oznacza to, że mantysa zawsze będzie w formie
0.α 1 α 2 ... α t x β str
gdzie β jest podstawą reprezentacji. Ale ponieważ ułamek jest liczbą binarną, α 1 będzie zawsze równy 1, więc ułamek można przepisać na 1.α 2 α 3 ... α t + 1 × 2 p, a początkowe 1 można założyć implicite, robiąc miejsce na dodatkowy bit (α t + 1 ).
Oczywiście prawdą jest, że podwójna liczba 32 to 64, ale nie od tego pochodzi to słowo.
Precyzja określa liczbę cyfr dziesiętnych, które są poprawne , czyli bez jakiegokolwiek błędu reprezentacji lub zbliżenia. Innymi słowy, wskazuje, ile cyfr dziesiętnych można bezpiecznie użyć.
Mając to na uwadze, łatwo oszacować liczbę cyfr dziesiętnych, których można bezpiecznie użyć:
źródło
OK, podstawowa różnica w maszynie polega na tym, że podwójna precyzja wykorzystuje dwa razy więcej bitów niż pojedynczy. W zwykłej implementacji jest to 32 bity dla pojedynczego, 64 bity dla podwójnego.
Ale co to znaczy ? Jeśli przyjmiemy standard IEEE, wtedy pojedyncza liczba precyzyjna ma około 23 bity mantysy i maksymalny wykładnik około 38; podwójna precyzja ma 52 bity mantysy i maksymalny wykładnik około 308.
Szczegóły jak zwykle na Wikipedii .
źródło
Aby dodać do wszystkich wspaniałych odpowiedzi tutaj
Przede wszystkim float i double służą do reprezentacji liczb ułamkowych. Tak więc różnica między tymi dwoma wynika z faktu, z jaką precyzją mogą przechowywać liczby.
Zasadniczo chcemy wiedzieć, jak dokładnie można zapisać liczbę i nazywamy to precyzją.
Cytując @Alessandro tutaj
Float może dokładnie przechowywać około 7-8 cyfr w części ułamkowej, podczas gdy Double może dokładnie przechowywać około 15-16 cyfr w części ułamkowej
Tak więc liczba zmiennoprzecinkowa może przechowywać podwójną ilość części ułamkowej. Dlatego Double nazywa się double the float
źródło
Jeśli chodzi o pytanie: „Czy ps3 i xbxo 360 mogą wykonywać operacje zmiennoprzecinkowe podwójnej precyzji, czy tylko pojedynczą precyzję, a ogólnie rzecz biorąc, czy możliwości podwójnej precyzji są wykorzystywane (jeśli istnieją?)”.
Uważam, że obie platformy nie są zdolne do podwójnego zmiennoprzecinkowego. Oryginalny procesor Cell miał tylko 32-bitowe zmiennoprzecinkowe, tak samo jak sprzęt ATI, na którym oparty jest XBox 360 (R600). Komórka otrzymała później obsługę podwójnej liczby zmiennoprzecinkowej, ale jestem prawie pewien, że PS3 nie korzysta z tego wiórów.
źródło
Zasadniczo arytmetyka zmiennoprzecinkowa pojedynczej precyzji zajmuje się 32-bitowymi liczbami zmiennoprzecinkowymi, podczas gdy podwójna precyzja zajmuje się 64 bitami.
Liczba bitów w podwójnej precyzji zwiększa maksymalną wartość, która może być przechowywana, jak również zwiększa precyzję (tj. Liczbę cyfr znaczących).
źródło
Wszystkie wyjaśniono szczegółowo i nic nie mógłbym dodać. Chociaż chciałbym to wyjaśnić w kategoriach Layman's lub prostym ANGIELSKIM
.....
Zmienna, która może przechowywać lub reprezentować wartość „1,9”, zapewnia mniejszą dokładność niż zmienna, która może przechowywać lub reprezentować 1,9999. Te ułamki mogą stanowić ogromną różnicę w dużych obliczeniach.
źródło
Podwójna precyzja oznacza, że przechowywanie liczb zajmuje dwa razy więcej czasu niż słowo. W 32-bitowym procesorze wszystkie słowa są 32-bitowe, więc liczby podwójne są 64-bitowe. W odniesieniu do wydajności oznacza to, że wykonywanie operacji na liczbach o podwójnej precyzji zajmuje trochę więcej czasu. Masz więc lepszy zasięg, ale jest mały spadek wydajności. To trafienie jest nieco łagodzone przez sprzętowe jednostki zmiennoprzecinkowe, ale nadal tam jest.
N64 wykorzystywał NEC VR4300 oparty na MIPS R4300i, który jest 64-bitowym procesorem, ale procesor komunikuje się z resztą systemu za pośrednictwem 32-bitowej magistrali. Tak więc większość programistów używała liczb 32-bitowych, ponieważ są one szybsze, a większość gier w tamtym czasie nie wymagała dodatkowej precyzji (więc używali liczb zmiennoprzecinkowych, a nie podwójnych).
Wszystkie trzy systemy mogą wykonywać operacje pływające o pojedynczej i podwójnej precyzji, ale może to nie być spowodowane wydajnością. (chociaż prawie wszystko po n64 używało 32-bitowej magistrali, więc ...)
źródło
Przede wszystkim float i double służą do reprezentacji liczb ułamkowych. Tak więc różnica między tymi dwoma wynika z faktu, z jaką precyzją mogą przechowywać liczby.
Na przykład: Muszę przechowywać 123.456789 Jeden może być w stanie przechowywać tylko 123.4567, podczas gdy inny może być w stanie zapisać dokładny 123.456789.
Zasadniczo chcemy wiedzieć, jak dokładnie można zapisać liczbę i nazywamy to precyzją.
Cytując @Alessandro tutaj
Precyzja wskazuje liczbę poprawnych cyfr dziesiętnych, tj. Bez jakiegokolwiek błędu w reprezentacji lub aproksymacji. Innymi słowy, wskazuje, ile cyfr dziesiętnych można bezpiecznie użyć.
Float może dokładnie przechowywać około 7-8 cyfr w części ułamkowej, podczas gdy Double może dokładnie przechowywać około 15-16 cyfr w części ułamkowej
Tak więc double może przechowywać podwojoną ilość części ułamkowej jak float. Dlatego Double nazywa się double the float
źródło
Zgodnie z IEEE754 • Standard dla przechowywania zmiennoprzecinkowego • Standardy 32 i 64-bitowe (pojedyncza precyzja i podwójna precyzja) • Odpowiednio wykładnik 8 i 11 bitowy • Rozszerzone formaty (mantysa i wykładnik) dla wyników pośrednich
źródło
Liczba pojedynczej precyzji wykorzystuje 32 bity, gdzie MSB jest bitem znaku, podczas gdy liczba podwójnej precyzji używa 64 bitów, MSB jest bitem znaku
Pojedyncza precyzja
SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)
Podwójna precyzja:
SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)
źródło