[C] Algorytm do konwersji systemów liczbowych

0

Witam

Szukam szybkiego algorytmu do konwersji na różne systemy liczbowe (2-40 znaków) z uwzględnieniem liczb niecalkowitych. Algorytm ma obsługiwać liczby nawet 10000 cyfrowe, więc będzie trzeba operować na dużych liczbach ale z tym sobie poradzę bo już to robiłem...
Nie oczekuję tu od Was żadnego gotowca, wystarczy zwykły link.
Rozwiązywałem już to zadanie "metodą szkolną", jednak taki algorytm jest zbyt wolny.

0

calkowite dodatnie : klasa/plik vlong z dzialu download co do zmiennoprzecinkowyc, kodowanie wyglada troche inaczej. oznacza sie osobno dlugosc cechy i mantysy (tudziez jedna z wartosc wychodzi z roznicy rozmiaru typu i drugiej ustalonej wartosci).

0

Niestety algorytm musi obsługiwać także liczby niecałkowite...

0

Ale przeciez ulamki nie powinny stanowic zadnego problemu. Zeby obliczyc wartosc ulamka wystarcza dzialania na liczbach calkowitych.

Na przyklad, zeby obliczyc ile to bedzie 1/3 w systemie szesnastkowym, obliczamy szesnastkowo:

1/3 = 0
10/3 = 5
100/3 = 55
1000/3 = 555

Czyli przesuwajac przecinek widac ze to bedzie 0.5555555.....

(chyba ze sie myle, jesli tak to niech mnie ktos poprawi :> )

0

Jeżeli chodzi o konwersje w różnych systemach liczbowych (oczywiście mówimy tutaj cały czas o systemach pozycyjnych), to nie ma różnicy, czy operuje się na liczbach rzeczywistych, czy też liczbach całkowitych.
Dla liczb całkowitych (dla systemu dziesiątkowego) mamy przecież:
1254 = 1103 + 210</sup>2 + 5101 + 410</sup>0
Podobnie robi się dla liczb niecałkowitych:
0,534 = 510(-1) + 310</sup>(-2) + 4*10^(-3)

Jak widać, jedyna różnica jest taka, że bierzemy ujemne potęgi (jeśli chodzi o implementację na komputerze, trzeba posłużyć się ujemnymi indeksami przy potęgowaniu).
To samo tyczy się innych, pozycyjnych systemów liczbowych (dwójkowym, szóstkowym, szesnastkowym itd.), trzeba jedynie liczbę 10 na inną (mówiąc fachowo: trzeba zmienić bazę systemu, albo jakoś tak ;-).

Pozdrawiam,
Paweł S.

// czlowieku, ty chyba jednak nie znasz budowy typow zmiennoprzecinkowych i skad ci do glowy przyszlo, ze liczby w pamieci sa trzymane w postaci potegi 10 ? [mf]

0

Ponoć komputery kasowe są wyposażone w procesory które wykonują również działania liczbach kodowanych w systemie dziesiętnym, żeby nie obcinać zaokrąglęń przy różnych działaniach. Do zapisu jednego znaku 0-9 używane są 4 bity, a więc 6 kombinacji jest niedozwolone. Małe marnotrawstwo, ale pozwala na lepsze osiągi. Przy konwersji liczby zmiennopprzecinkowej wystarczy zmienić tylko dwie liczby całkowite, mantysę i ceche. Kodowanie liczb ze znakiem trzeba sobie jakoś ustalić.

Ale nasze PC-ty niestety radzą sobie tylko na liczbach binarnych. Więc jeśli chcemy wykonywać jakieś działania na liczbach, to muszą one być kodowane binarnie. W takiej sytuacji cała konwersja jest wykonywana podczas konwersji string->liczba - rozwiązanie książkowe. Bierzemy kolejny znak, zapisujemy go binarnie (np funkcją atoi), później binarnie mnożymy przez wykładnik, wymnażamy wykładnik przez baze i bierzemy następny. Przy konwersji w drugą strone jest podobnie. Przy konwersji stringM<->stringN liczb w różnych systemach M i N najpierw wykonywana jest konwersja z M na binarny a później z binarny na N.

Kodująć liczby w różnych systemach liczbowych nie możemy łatwo wykonywać na nich działań, ale są one wygodne przy ich przechowywaniu. Wtedy konwersja string<->liczba jest bardzo prosta, polega na binarnym dodaniu do każdego znaku odpowiedniej liczby. Przy konwersji liczbaM<->liczbaN nic nie będzie z tego sposobu, bo nie wykonamy żadnych szybkich działań w tych systemach.

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