Operacje na BARDZO dużych liczbach.

0

Witam. Pisze sobie programik do obliczania kombinacji ale natknąłem się na problem gdy silnia z 34 dawała 0 dla zapisu howMessage(Format('%u',[PowE(34)])); nie wiem czy dało by się jakoś wyświetlić ten wynik, poza tym co było jak bym miał liczyć z 64, pewnie zabraknie miejsca

function PowE(N: Integer): Cardinal;
var I: Integer;
begin
 Result:=1;
 if N < 1 then Exit else for I:=1 to N do Result:=Result*I;
end;

większego typu dla naturalnych nie znam niż Cardinal. Nie wiem czego by tu użyć dla dużych liczb mam na mysli dziesiątki zer (operacje są na liczbach naturalnych). Wdzięczny był bym za pomoc.

0

Int64 - -9223372036854775808 .. 9223372036854775807
QWord - 0 .. 18446744073709551615 (nie wiem jak w Delphi, ale w FPC na pewno istnieje)

Większe liczby uzyskasz tylko za pomocą odpowiednich bibliotek bądź jeżeli sam sobie takową bibliotekę stworzysz (czyt.liczba będzie reprezentowana np.za pomocą tablicy, a każda operacja będzie robiona ręcznie).

0

qword nie ma :(

0

Napisz własne bignumy albo użyj jakiejś gotowej biblioteki.

0

ehh wole napisać sobie przynajmniej się czegoś nauczę ;] jeszcze, jak zwykle napotkam kolejne problemy ... dzięki za pomoc

0

A tak wgl to jak sie zabrać za pisanie takiego czegoś? Obecnie mam dwa pomysły. Zadziała któryś?

type
  LongLong = 0.564168416541747987465132186798454163541864241654...//pierdyliard razy

albo

type
  TLongLong = array [0..9] of Cardinal;

i do tego jakieś funkcje do dodawnia i innych dupereli.

0

A tak wgl to jak sie zabrać za pisanie takiego czegoś?

Najczęściej to robią to tak:
bignum:string;
i potem implementują własną arytmetykę na stringach. Przynajmniej z takimi rozwiązaniami się spotkałem.

Twoje oba rozwiązania raczej mijają się z celem, bo polegają na skończonej (i mocno ograniczonej) dokładności natywnych obliczeń.

0

Rozwiązanie z tablicą typu cardinal jest w zasadzie lepsze niż na stringu, bo działania będą szybsze i liczba zajmie znacznie mniej pamięci.
Obliczenia sprowadzą się w zasadzie do działań w systemie o podstawie 2^32.
Ale string ma tę zaletę, że nie trzeba go przekształcać na postać tekstową do wyświetlenia.

0

Ale w 4 bajtowym stringu można pomieścić liczbe 0-999, a w takim Cardinalu (który chyba jest 4 bitowy) 0-4294967296. To dosyć duża strata :/

Cardinal jest 4 bitowy? Śmiechu warte. Cardinal ma 4 BAJTY. I jak się uprzeć, to dałoby się napisać system operujący na boolach tak żebyś nie płakał nad stratą paru bajtów (i tak przez narzut środowiska tracisz pare MB - używaj assemblera!), tylko że byłoby to trudniejsze.

Przejmujesz się utratą paru bajtów, tylko że nie zwracasz uwagi na to, że gdybyś chciał zaoszczędzić miejsca w pamięci, to nie zacząłbyś od tego systemu. Żyjemy w roku 2012, typowy komputer ma co najmniej 1GB ramu, a ty się martwisz o parę bajtów? W dzisiejszych czasach to mało kto się martwi o wyciek 1MB ramu... (wystarczy popatrzeć na tak 'zoptymalizowane' aplikacje jak np. Skype).

Naprawdę, skoro tobie zależy na jak najmniejszym rozmiarze, to koniecznie użyj typu real48 (nawet nie wiem jaki współczesny kompilator Pascala to wspiera) i zapisuj w nim dowolnie duże liczby, najwyżej 'trochę' na dokładności stracisz...

0

Ale gdybyś w takim stringu chciał zapisać liczbę mieszczącą się w 4 bajtach, to dostałbyś 4MB.

A nie 4GB? Albo od razu 4TB.

Weź się hamuj z głupotami które mówisz, bo aż mi się niedobrze robi że osoba którą uważałem za całkiem niegłupią plecie 3 po 3. Idź już używaj real48.

1 użytkowników online, w tym zalogowanych: 0, gości: 1