Float i Int po 4 bajty? Jak To?

Int to 4 bajty o zakresie + - 2^31 Float to 4 bajty o zakresie + - 1.2 E (+- 38)

Float obejmuje tak wiele więcej punktów Na Rzeczywistej linii, A jednak jest równy rozmiarowi int. Czy reprezentacja znaku-wykładnika-ułamka float jest tak niesamowita (czy dopełnienie 2 Int jest tak żałosne), że powstaje ta rozbieżność wielkości? Coś przeoczyłem?

Wydaje mi się bardzo zaskakujące, że coś, co reprezentuje (praktycznie) całą rzeczywistą linię, jest tej samej wielkości, co które reprezentują liczby całkowite.

Author: mskfisher, 2012-01-05

6 answers

Cóż, oto szybkie wyjaśnienie:

Int i float zwykle przyjmują w pamięci "jedno słowo". Dzisiaj, przy przejściu na systemy 64-bitowe może to oznaczać, że Twoje słowo ma 64 bity lub 8 bajtów, umożliwiając reprezentację ogromnej rozpiętości liczb. Albo może to być system 32-bitowy, co oznacza, że każde słowo w pamięci zajmuje 4 bajty. Zazwyczaj dostęp do pamięci można uzyskać słowo po słowie.

Różnica między int a float nie jest ich fizyczną przestrzenią w pamięci, ale w sposób ALU (arytmetyczna Jednostka logiczna) zachowuje się z liczbą. Int reprezentuje swoją bezpośrednio odpowiadającą liczbę w binarnym (prawie -- używa dwójkowej notacji dopełniacza ). Z kolei float jest zakodowane (zazwyczaj w standardowym formacie IEEE 754), aby reprezentować liczbę w postaci wykładniczej (np. 2.99*10^6 jest w postaci wykładniczej).

Twoje nieporozumienie myślę, że leży w błędnym przekonaniu, że zmiennoprzecinkowy może reprezentować więcej informacji. While float S może reprezentować liczby o większej wielkości nie może reprezentować ich z taką dokładnością, ponieważ musi uwzględniać kodowanie wykładnika. Wykładnik sam w sobie może być dość dużą liczbą. Tak więc liczba znaczących cyfr, które otrzymujesz z liczby zmiennoprzecinkowej jest mniejsza (co oznacza, że mniej informacji jest reprezentowanych) i podczas gdy int s reprezentują zakres liczb całkowitych, wielkość liczb, które reprezentują, jest znacznie mniejsza.

 40
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-17 03:43:15

Wydaje mi się to bardzo zaskakujące, że coś, co reprezentuje (praktycznie) całą rzeczywistą linię, jest tej samej wielkości, co ta, która reprezentuje liczby całkowite.

Być może stanie się to mniej zaskakujące, gdy zdasz sobie sprawę, że istnieje wiele liczb całkowitych, które 32-bitowy int może dokładnie reprezentować, a 32-bitowy float nie może.

A float może reprezentować mniej odrębnych liczb niż int, ale są one rozłożone na szerszy zakres.

Jest to również warto zauważyć, że odstęp między kolejnymi floats staje się szerszy w miarę oddalania się od zera, podczas gdy pozostaje stały dla kolejnych ints.

 20
Author: NPE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-05 17:12:08

Uważam, że ważnym punktem jest to, że int jest dokładny, podczas gdy float może być zaokrąglony. Część danych w zmiennej zmiennoprzecinkowej opisuje położenie dziesiętne, podczas gdy inna część określa wartość. Tak więc, chociaż możesz być w stanie pokazać 1. 2E38, tylko kilka pierwszych cyfr może być poprawne, a reszta może być wypełniona przez 0.

From: http://en.wikipedia.org/wiki/Floating_point

" z siedmioma cyframi dziesiętnymi może dodatkowo reprezentować 1.234567, 123456.7, 0.00001234567, 123456700000000, i tak dalej"

To zależy od tego, jak dany system implementuje.

 1
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-05 17:04:43

Może powinieneś nauczyć się Jak liczby zmiennoprzecinkowe są reprezentowane w komputerze. bardzo różni się od sposobu reprezentacji liczb całkowitych.

Warto również zauważyć, że INT nie zawsze ma długość 4 bajtów, zależy od systemu.

 0
Author: Nick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-05 17:01:47

Oba typy reprezentują tę samą ilość punktów na rzeczywistej linii - są po prostu rozmieszczone inaczej. Różnica między najwyższym a drugim najwyższym pływakiem wynosi ok. 256!

 0
Author: Eugen Rieck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-05 17:04:37

Standard dla zmiennoprzecinkowych zgodnie ze standardami wymaga base=2 zamiast base = 10 i 24 cyfry (precyzja). Ponieważ nie jest to baza 10, format bazy 2 może reprezentować tylko określony zbiór liczb rzeczywistych (co jest nieodłączną przyczyną błędu w przedstawianiu liczb rzeczywistych). Oznacza to również, jak wcześniej, że float nie reprezentuje o wiele więcej liczb w porównaniu do int.

 0
Author: thunde47,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-02 02:55:30