Liczba stała a liczba zmiennoprzecinkowa

109

Po prostu nie rozumiem liczb stałych i zmiennoprzecinkowych z powodu trudnych do odczytania ich definicji w Google. Ale żadne z nich nie dostarcza wystarczająco prostego wyjaśnienia, czym one naprawdę są. Czy mogę uzyskać prostą definicję z przykładem?

user942451
źródło
Mam też problem ze znalezieniem dobrej definicji. Najważniejsze, czego szukam, to coś, co pomoże mi zrozumieć te wyniki: 3,11 + 42,0 = 45,110001 (nie 45,11), 3,12 + 42,0 = 45,119999 (nie 45,12), 3,15 + 42,0 = 45,150002 (nie 45,15).
Bart S.
1
Myślę, że jest to istotna dyskusja (szczególnie opisująca pułapki z liczbami zmiennymi i lepszą precyzją ze stałymi punktami oraz dlaczego nigdy nie chciałbyś opisywać pieniędzy jako pływaka. Stackoverflow.com/questions/6320209/ ...
Andrew Norman
Losowe łącze, w którym poruszane są tematy „OpenGL® ES OpenGL ES zawiera profile systemów zmiennoprzecinkowych i stałoprzecinkowych oraz specyfikację EGL ™…”
The Red Pea

Odpowiedzi:

145

Liczba stałoprzecinkowa ma określoną liczbę bitów (lub cyfr) zarezerwowanych dla części całkowitej (część po lewej stronie przecinka dziesiętnego) i określoną liczbę bitów zarezerwowanych dla części ułamkowej (część po prawej stronie przecinka punkt). Bez względu na to, jak duża lub mała jest twoja liczba, zawsze będzie używać tej samej liczby bitów dla każdej porcji. Na przykład, jeśli twój format stałego punktu był dziesiętny, IIIII.FFFFFwówczas największą liczbą, którą możesz przedstawić, byłaby, 99999.99999a najmniejszą liczbą niezerową 00000.00001. Każdy bit kodu, który przetwarza takie liczby, musi mieć wbudowaną wiedzę o miejscu przecinka.

Liczba zmiennoprzecinkowa nie rezerwuje określonej liczby bitów dla części całkowitej lub ułamkowej. Zamiast tego rezerwuje pewną liczbę bitów dla numeru (zwany mantysa lub mantysy ) i pewną liczbę bitów do powiedzenia , gdzie w tym miejsce dziesiętne liczby siedzi (zwanej wykładnik ). Zatem liczba zmiennoprzecinkowa, która zajmowała 10 cyfr z 2 cyframi zarezerwowanymi dla wykładnika, może reprezentować największą 9.9999999e+50i najmniejszą niezerową wartość 0.0000001e-49.

Gabe
źródło
8
Cóż, zapominasz, że liczby zmiennoprzecinkowe są prawie zawsze podpisane, więc tak naprawdę byłaby minimalna wartość -9.9999999e+50.
Brian Gordon,
4
Istnieje również odchylenie wykładnicze, dzięki czemu można przedstawić znacznie więcej dyskretnych wartości z zakresu od 0 do 1 niż od 1 000 000 do 1 000 001. Istnieje wiele komplikacji związanych z operacjami zmiennoprzecinkowymi, które pojawiają się, na przykład zapewnienie, że nie zgłosisz 0 jako różnicy między dwiema bardzo podobnymi liczbami, gdy odchylenie nie jest wystarczające, aby zwiększyć precyzję.
Brian Gordon,
28
@BrianGordon: Nie zapomniałem znaków na znak; Celowo je zignorowałem, aby mieć prosty opis i nie martwić się różnicą między minimum / maksimum a najmniejszym / największym. Celowo pominąłem również odchylenie wykładników (które nie ma nic wspólnego z liczbą dyskretnych wartości między dowolnymi dwiema liczbami), NaN, nieskończoności, normalizację, stopniowy niedomiar, zera ze znakiem, fakt, że większość liczb zmiennoprzecinkowych jest binarna (co pozwala na pierwszy bit mantysy do pominięcia) oraz szereg innych aspektów, które są niepotrzebne do zilustrowania koncepcji.
Gabe,
2
Dlaczego obowiązuje minimalna liczba punktów stałych 00000.00001? Spodziewam się 00000.00000zamiast tego zobaczyć . Czy masz też jakieś odniesienia, które zawierają bardziej szczegółowe informacje na temat liczb stałych?
Nicholas Miller
4
@NickMiller: Przepraszam za zamieszanie, ale mówiłem o liczbach niezerowych. Mój przykładowy format może reprezentować 0, 0,00001, 0,00002, ..., 99999,9998, 99999,99999.
Gabe
31

Liczba stała oznacza po prostu, że po przecinku znajduje się stała liczba cyfr. Liczba zmiennoprzecinkowa pozwala na zmianę liczby cyfr po przecinku.

Na przykład, jeśli masz sposób przechowywania liczb, który wymaga dokładnie czterech cyfr po przecinku, jest to punkt stały. Bez tego ograniczenia jest zmiennoprzecinkowa.

Często, gdy używany jest punkt stały, programista w rzeczywistości używa liczby całkowitej, a następnie przyjmuje założenie, że niektóre cyfry są poza kropką dziesiętną. Na przykład mógłbym chcieć zachować dokładność dwóch cyfr, więc wartość 100 oznacza w rzeczywistości 1,00, 101 oznacza 1,01, 12345 oznacza 123,45 itd.

Liczby zmiennoprzecinkowe są bardziej ogólnego przeznaczenia, ponieważ mogą w ten sam sposób reprezentować bardzo małe lub bardzo duże liczby, ale istnieje niewielka kara w przypadku konieczności posiadania dodatkowego miejsca na miejsce po przecinku.

Vaughn Cato
źródło
2
użycie liczb zmiennoprzecinkowych staje się problemem, gdy zaczynasz wykonywać z nimi obliczenia, na przykład, jeśli dodasz razem naprawdę małą i naprawdę dużą liczbę zmiennoprzecinkową. Sumowany wynik traci dokładność, ponieważ musi przedstawiać liczbę z dwoma ekstremami, a dolne cyfry dziesiętne są obcinane (i nie są zaokrąglane).
Andrew Norman
2
również potencjalne użycie wartości wykładników w liczbach zmiennoprzecinkowych może powodować problemy z systemami komputerowymi oczekującymi standardowych liczb
Andrew Norman
5

Z mojego punktu widzenia arytmetyka stałoprzecinkowa jest wykonywana przy użyciu liczb całkowitych. gdzie część dziesiętna jest przechowywana w ustalonej liczbie bitów lub liczba jest mnożona przez wymaganą liczbę cyfr z dokładnością dziesiętną.

Na przykład, jeśli liczba 12.34ma zostać zapisana i potrzebujemy tylko dwóch cyfr dokładności po przecinku, liczba jest mnożona przez, 100aby uzyskać 1234. Podczas wykonywania obliczeń matematycznych na tej liczbie używamy tego zestawu reguł. Dodanie 5620lub 56.20do tej liczby dałoby 6854dane lub 68.54.

Jeśli chcemy obliczyć część dziesiętną liczby stałoprzecinkowej, używamy operandu modulo (%).

12,34 (pseudokod):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

Liczby zmiennoprzecinkowe to zupełnie inna historia w programowaniu. Obecny standard dla liczb zmiennoprzecinkowych używa około 23 bitów dla danych liczby, 8 bitów dla wykładnika i 1, ale dla znaku. Zobacz ten link do Wikipedii, aby uzyskać więcej informacji na ten temat.

Panie Goober
źródło
3

Termin „stały punkt” odnosi się do odpowiedniego sposobu przedstawiania liczb, ze stałą liczbą cyfr po przecinku, a czasem przed nim. W przypadku reprezentacji zmiennoprzecinkowej kropka dziesiętna może „pływać” względem znaczących cyfr liczby. Na przykład reprezentacja stałoprzecinkowa z jednolitą konwencją umieszczania przecinka dziesiętnego może reprezentować liczby 123,45, 1234,56, 12345,67 itd., Podczas gdy reprezentacja zmiennoprzecinkowa może dodatkowo przedstawiać 1,234567, 123456,7, 0,00001234567, 1234567000000000 itd.

user3553000
źródło
-6

Weź numer 123.456789

  • Jako liczba całkowita ta liczba będzie wynosić 123
  • Jako punkt stały (2) ta liczba wynosiłaby 123,46 (zakładając, że zaokrągliłeś ją w górę)
  • Jako liczba zmiennoprzecinkowa byłaby to 123,456789

Liczba zmiennoprzecinkowa pozwala na bardzo precyzyjne przedstawienie większości liczb. Naprawiono jest mniej precyzyjne, ale prostsze dla komputera.

iskrzący
źródło
11
Precyzja, z jaką można zapisać liczbę, nie jest związana z tym, czy jest ona zapisywana w postaci zmiennoprzecinkowej, całkowitej czy stałej. Jest to związane z liczbą dostępnych cyfr znaczących. Na przykład INT_MAX to liczba, która może być dokładnie reprezentowana jako liczba całkowita, ale nie jako liczba zmiennoprzecinkowa, ponieważ nie mają 31 bitów precyzji potrzebnych do dokładnego przedstawienia.
Kian,
1
Naprawiono jest najdokładniejsze, o ile ma rozmiar odpowiadający danej liczbie. Kiedy wykonujesz obliczenia matematyczne z liczbami stałymi punktami, zaokrąglanie ma miejsce, gdy w obliczeniu reszta przekracza limit dziesiętny. W przypadku liczby zmiennoprzecinkowej można uzyskać bardzo niedokładną wartość, dodając bardzo małą liczbę do bardzo dużej. Kiedy to nastąpi, cyfry są tracone bez zaokrąglania
Andrew Norman
To jest mylące i złe. Punkt stały oznacza, że ​​liczba cyfr po przecinku jest stała. Nie mówi nic o tym, ile ma precyzji.
Oscar Smith