Baaaardzo du?że (małe) liczby...

0

<font color="darkblue">W poście "Wyliczanie liczby PI" http://4programmers.net/Forum/viewtopic.php?id=37628 zaproponowałe zapisywanie danych w postaci ułamka z dwóch liczb w string'u. To daje do kładność maksymalną rzędu 1/2562147483647 i maksymalną zapisamą liczbę 2562147483647. [cygaro] Zarypiste!! co??
tylko, że trzeba zrobic typy danych i funkcje do podstwawowych operacji matematycznych [stuk] (nawet jusz zacząłem >> stwierdziłem że lepsze od stringów będą strumienie >> wtedy maxymalna dokładność wynosi 1/2569223372036854775807 a maxymalna wartość 2569223372036854775807...)

Tylko z tymi funkcjami nie jest tak prosto:

  • dodawanie i odejmowanie jest stosunkowo proste (teoretycznie :-8 ) >> na zasadzie dzielenia liczby na poszczególne człony typu integer i dodawanie ich (tak jak dodawanie słópków jakiego się uczyliśmy w czwartej klasie podstawówki).

Tylko jak zrobić <font color="red">mnorzenie</span> i dzielenie, obliczanie reszty z dzielenia, potęgowanie itp tak by nie dodawać n razy tą samą liczbe do siebie (<font color="red">mnorzenie</span>) lub odejmować (dzielenie) do zera

To przecież trwało by wieczność!! :-[ </span>

0

Swojego czasu nawet trochę zajmowałem się tym problemem, zrobiłem nawet procedurki na dodawanie i chyba odejmowanie. Wprowadziłem nowy typ TLiczba (od TObject) na który składały się dwa Stringi - Licznik i Mianownik i Znak jako Boolean, czy jakoś tak (dokładnie nie pamiętam).

Liczba w pamięci przechowywana była jako ułamek zwykły, zaś rozwinięcie dziesiętne miało być wydobywane z funkcji.

Co do procedurek - dodawanie i odejmowanie to raczej banał, mnożenie i dzielenie właściwie też tylko trzeba algorytm wzorować na czynności mnożenia i dzielenia pisemnego.

Porzuciłem pracę nad tym projektem po zdobyciu Mathematiki :)

pozdrawiam,
PieterEr

0

Heh jak bede miał czas to <font color="red">sprubuje</span> to zrobic :-)
<font color="red">Wmiare</span> łatwo bedzie zrobic klase w c++ do liczb całkowitych opartaą na buforze:
kazdy bajt to zwiekszenie pojemnosci liczby - liczba*256, czyli mając np: 40 bajtów w pamieci mozemy uzyskac liczbę:
2.1359870359209100823950217061696 * 10 ^ 96 !!!!
Podstawowe operacje na czyms takim mozna wykonac chyba za pomocą funkcji logicznych i operatorów matematycznych.
Gorzej bedzie to wyswietlac ;)

Ale to wszystko pikus przy zrobieniu liczb zmienno przecinkowych :-(
To bedzie trudne [stuk] i fajne :-)

0

Macie tu kod w FreePascalu do dużych liczb:

()
(
DuzaLiczba )
(
)

const
Ilosc = 50;

type
MojTyp = Cardinal;
DuzaLiczba = record
z: array[1..Ilosc] of MojTyp;
Ile: Integer
end;

operator + (A, B: DuzaLiczba) wynik: DuzaLiczba;
var
ii, x: Integer;
Przenies: Boolean;
tmpA, tmpB, tmpW: MojTyp;
begin
FillChar(wynik, SizeOf(wynik), 0);
Przenies:=false;
x:=A.Ile;
if B.Ile > x then x:=B.Ile;
for ii:=1 to x do begin
tmpA:=A.z[ii]; tmpB:=B.z[ii];
if tmpA = 0 then begin
if Przenies then begin
wynik.z[ii]:=tmpB + 1;
przenies:=wynik.z[ii] = 0
end else begin
wynik.z[ii]:=tmpB;
Przenies:=false
end
end else if tmpB = 0 then begin
if Przenies then begin
wynik.z[ii]:=tmpA + 1;
przenies:=wynik.z[ii] = 0
end else begin
wynik.z[ii]:=tmpA;
Przenies:=false
end
end else begin
if Przenies
then tmpW:=tmpA + tmpB + 1
else tmpW:=tmpA + tmpB;
wynik.z[ii]:=tmpW;
Przenies:=((tmpW = tmpB then tmpW:=tmpA - tmpB else begin
tmpW:=$FFFFFFFF - tmpB + tmpA + 1;
jj:=lniezero;
while wynik.z[jj] = 0 do jj:=niezero[jj];
Dec(wynik.z[jj]);
for jj:=ii + 1 to jj - 1 do wynik.z[jj]:=$FFFFFFFF;
if wynik.z[jj] = 0 then niezero[jj]:=niezero[jj + 1]
end;
if tmpW 0 then lniezero:=ii;
wynik.z[ii]:=tmpW
end;
wynik.Ile:=A.Ile;
while (wynik.Ile 0) and (wynik.z[wynik.Ile] = 0) do Dec(wynik.Ile)
end;

operator B.ile;
if (A.ile = B.ile) then
for ii:=A.Ile downto 1 do
if A.z[ii] B.z[ii] then begin
wynik:=true;
Break
end
end;

operator = (A, B: DuzaLiczba) wynik: Boolean;
var
ii: Integer;
begin
wynik:=A.ile = B.ile;
if wynik then for ii:=1 to A.ile do if A.z[ii] B.z[ii] then begin
wynik:=false;
Break
end;
end;

0

;-( <font color="blue"></span><font size="12"></span>

APEL O POMOC !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Mam do jutra zdać program na zaliczenie, który ma wykonywać operacje arytmetyczne na bardzo dużych liczbach, zrobiłem już dodawanie i odejmowanie ale nie potrafię zrobić dzielenia i mnożenia !!!!!!!! Proszę o pomoc... tylko musiała by być szybka bo jeszcze dzisiaj.
[email protected]

Plik z kodem źródłowym jest na 4programmers w dziale kody źródłowe/Pascal

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