Strona 1 z 1

[MATLAB] i rekurencja (duże liczby)

: 21 lip 2012, o 18:45
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

[MATLAB] i rekurencja (duże liczby)

: 21 lip 2012, o 21:55
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?

[MATLAB] i rekurencja (duże liczby)

: 21 lip 2012, o 22:05
autor: wszamol
Long chyba nie załatwi sprawy, bo więcej niż 15 cyfr nie dostaniesz, ale specjalistą od matlaba nie jestem.

[MATLAB] i rekurencja (duże liczby)

: 21 lip 2012, o 22:06
autor: dexter90
No nie załatwi. Szkoda ekranu na 200 zer albo więcej. Przed oczyma miałem nieco mniejszy wynik od Autora. Pozdrawiam

[MATLAB] i rekurencja (duże liczby)

: 21 lip 2012, o 22:47
autor: ksisquare
> f(n)=if(n==0,1,1+n*f(n-1))

[MATLAB] i rekurencja (duże liczby)

: 22 lip 2012, o 00:18
autor: BSP
Dziękuję za pomoc

Zostawiam więc chwilowo matlaba i skupię się na C++ i PARI/GP, dziękuję za linka ksisquare

[MATLAB] i rekurencja (duże liczby)

: 22 lip 2012, o 06:20
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}\)