Komputery, choć mogą dużo obliczeń bardzo szybko obliczyć, borykają się z precyzją obliczeń. Wyniki obliczeń bardzo często są jedynie przybliżeniem, a nie faktycznym wynikiem operacji arytmetycznej. W tym artykule zostanie przedstawiony sposób jak tego uniknąć i wypisać wynik z praktycznie dowolną dokładnością.
Komputer jest w stanie wyliczyć wynik dzielenie praktycznie z dowolną dokładnością, ale ogranicza go metoda przechowywania danych w komputerze. Oznacza to, że chcą obliczyć wynik dzielenia z dowolną dokładnością należy zapomnieć o przechowywaniu wyniku w standardowych typach danych. Istnieje możliwość, aby kolejno wyliczone cyfry wypisywać na konsolę, albo do pliku.
Algorytm, który pozwala na dzielenie z dowolną dokładnością jest implementacją dzielenia pisemnego. Otóż w pętli należy nonstop obliczać aktualny wynik dzielenie poprzednią resztę przez dzielnik, aby dopisać kolejną cyfrę. Nową resztę do kolejnej iteracji oblicza się poprzez pomnożenie aktualnej przez 10, a następnie podzieleniu przez dzielnik.
Na początek weźmy prosty przykład - podzielimy 1 przez 8. W tym celu kolejno należy wykonać:
Reszta | Nowa cyfra | Nowa reszta | Komentarz |
---|---|---|---|
1 | 0. | 1 · 10 | W celu obliczenia pierwszej reszty wykonujemy 1 mod 8 |
10 | 1 | (10 - 8·1)·10 = 20 | Pierwsza cyfra po przecinku to 1 |
20 | 2 | (20 - 8·2)·10 = 40 | Kolejna cyfra to 2 |
40 | 5 | (40 - 8·5)·10 = 0 | Reszta wyniosła 0, można zakończyć obliczenia |
Używając algorytmu udało się wyznaczyć, że 1/8 = 0.125.
Funkcja dzielPrecyzja() przyjmuje 3 argumenty: n - liczbę do podzielenia, d - dzielnik oraz k - ile miejsc po przecinku wypisać. Wynik jest wypisywany bezpośrednio na konsolę.
Przed rozpoczęciem pętli algorytm oblicza resztę początkową, a następnie w pętli oblicza kolejne cyfry rozwinięcia dziesiętnego wyniku. Każda kolejna cyfra jest wypisywana na konsolę.
Poniższy fragment kodu wczytuje od użytkownika liczbę do podzielenia, dzielnik oraz ile cyfr po przecinku wypisać.
Napisz funkcję dzielPrecyzja(), która wypisze maksymalnie k miejsc po przecinku. Jeśli od pewnego momentu wszystkie kolejne cyfry to 0 to program nie powinien ich wypisać przykładowo wypisanie wyniki 1/8 z dokładnością do 10 miejsc po przecinku powinno wypisać jedynie 0.125 zamiast 0.1250000000.