[MATLAB] i rekurencja (duże liczby)

Awatar użytkownika
BSP
Użytkownik
Użytkownik
Posty: 69
Rejestracja: 2 gru 2008, o 11:45
Płeć: Mężczyzna
Lokalizacja: W pewnym otoczeniu nieskończoności (Wrocław)
Podziękował: 11 razy
Pomógł: 6 razy

[MATLAB] i rekurencja (duże liczby)

Post autor: BSP »

Witam! :mrgreen:
Chciałem napisać prosty programik w MATLAB'ie, liczący \(\displaystyle{ f(n)}\) , gdzie:

\(\displaystyle{ f(0) = 1}\)

\(\displaystyle{ f(n) = 1 + n f(n-1)}\)

skleciłem coś takiego

Kod: Zaznacz cały

function a = sumasilniabinomial(n)

if n==0
    a=1;
else
    a=1;
        for k=1:n;
            a=1+k*a;
        end                
end
end
Kod jak najbardziej działa, ale mam problem jak wyświetlić dokładną wartość dla nieco większych liczb, np. dla \(\displaystyle{ n=150}\) mam odpowiedź

Kod: Zaznacz cały

ans =

  1.5531e+263
Nie wiem też jak rozwiązać problem z liczeniem funkcji dla liczb większych niż 170, gdyż wtedy wyświetla mi

Kod: Zaznacz cały

ans =

   Inf
:(
Głównie jednak chodzi mi o możliwość wyświetlania dokładnego wyniku, np. zamiast \(\displaystyle{ 1.5531e+263}\)
chciałbym, by mi pokazał

Kod: Zaznacz cały

15530587787816211682219642768268073428243574525577152573186625231647001894087190962465
86295932899263205825162408558809928658995715743976913170898272039427934247122194267442
77804734420224298185323081413896801104549583083214118879069441437623651199932805792771
830501
Problem rozwiązałem w C++ w ciągu 5 minut, gdyż miałem gotowy programik do liczenia silni dużych liczb poprzez traktowanie ich jako obiekty typu string... jednak MATLAB, który teoretycznie jest przeznaczony do różnego typu obliczeń chyba powinien mieć możliwość operowania na większych liczbach, albo przynajmniej wyświetlania dokładnego wyniku? :cry:
Niestety nie jestem jeszcze dobry w MATLAB'ie, stąd mój post tutaj :)

Pozdrawiam
dexter90
Użytkownik
Użytkownik
Posty: 391
Rejestracja: 11 lis 2011, o 09:48
Płeć: Mężczyzna
Pomógł: 32 razy

[MATLAB] i rekurencja (duże liczby)

Post autor: dexter90 »

Po prostu trzeba zdeklarować odpowiedni format na początku m-pliku... Poczytaj, jak nie znajdziesz to Ci powiem na jaki.
Ukryta treść:    
Btw \(\displaystyle{ 10^{308}}\) to duża liczba, ścigasz się z Grahamem?
wszamol
Użytkownik
Użytkownik
Posty: 490
Rejestracja: 7 maja 2009, o 22:01
Płeć: Mężczyzna
Podziękował: 1 raz
Pomógł: 64 razy

[MATLAB] i rekurencja (duże liczby)

Post autor: wszamol »

Long chyba nie załatwi sprawy, bo więcej niż 15 cyfr nie dostaniesz, ale specjalistą od matlaba nie jestem.
dexter90
Użytkownik
Użytkownik
Posty: 391
Rejestracja: 11 lis 2011, o 09:48
Płeć: Mężczyzna
Pomógł: 32 razy

[MATLAB] i rekurencja (duże liczby)

Post autor: dexter90 »

No nie załatwi. Szkoda ekranu na 200 zer albo więcej. Przed oczyma miałem nieco mniejszy wynik od Autora. Pozdrawiam
ksisquare
Użytkownik
Użytkownik
Posty: 132
Rejestracja: 1 cze 2012, o 07:04
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 15 razy

[MATLAB] i rekurencja (duże liczby)

Post autor: ksisquare »

> f(n)=if(n==0,1,1+n*f(n-1))
Awatar użytkownika
BSP
Użytkownik
Użytkownik
Posty: 69
Rejestracja: 2 gru 2008, o 11:45
Płeć: Mężczyzna
Lokalizacja: W pewnym otoczeniu nieskończoności (Wrocław)
Podziękował: 11 razy
Pomógł: 6 razy

[MATLAB] i rekurencja (duże liczby)

Post autor: BSP »

Dziękuję za pomoc

Zostawiam więc chwilowo matlaba i skupię się na C++ i PARI/GP, dziękuję za linka ksisquare
ksisquare
Użytkownik
Użytkownik
Posty: 132
Rejestracja: 1 cze 2012, o 07:04
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 15 razy

[MATLAB] i rekurencja (duże liczby)

Post autor: ksisquare »

a w C, jeżeli zamiast korzystać z np. lub

Kod: Zaznacz cały

http://www.mpir.org/
chcesz to robić na piechotę to string jest najgorszym pomysłem.
Za podstawę można przyjąć 10'000 wtedy mnożenie mieści się w int, ale można i 1'000'000'000 wspierając się long long.
A wtedy zamiast \(\displaystyle{ 9*9=81}\) mnożeń wystarczy jedno.
Podstawa będąca potęgą 10 ułatwia wyświetlenie wyników, ale spowalnia obliczenia.
Szybciej liczy się, gdy podstawa to \(\displaystyle{ 2^{16}}\) lub \(\displaystyle{ 2^{32}}\) (lecz zamiana na postać dziesiętną może zjeść nawet więcej niż się zaoszczędzi).

[url=http://ideone.com/LsaNG]IdeOne.com[/url] w 3.57 sek. policzyło i pokazało dokładną wartość \(\displaystyle{ f(16873) \vKurL}\)
Wielkość wyniku łatwo oszacować dzięki \(\displaystyle{ f(n)=\lfloor e\cdot n!\rfloor}\)
ODPOWIEDZ