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?
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).
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/ ...
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.
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ę.
@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.
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?
@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.
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.
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).
również potencjalne użycie wartości wykładników w liczbach zmiennoprzecinkowych może powodować problemy z systemami komputerowymi oczekującymi standardowych liczb
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"
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.
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.
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
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.