Witam; Jak pomnożyć dwie liczby np. 98123456 x 1.000002 = 98123652 za pomocą rejestrów procesora 8 bitowego. Przekształcenia na typ "float" nie dadzą rezultatu ( mantyse w IEEE 754 reprezentuje 7 cyfr dziesiętnych)
pozdr. swiniaczek
Witam; Jak pomnożyć dwie liczby np. 98123456 x 1.000002 = 98123652 za pomocą rejestrów procesora 8 bitowego. Przekształcenia na typ "float" nie dadzą rezultatu ( mantyse w IEEE 754 reprezentuje 7 cyfr dziesiętnych)
pozdr. swiniaczek
Witam
Może tak. A x (1 + 0.000002) = A + A x 0.000002. Mnożysz A przez 2, dzielisz przez liczbę pozycji po przecinku(10^n) i dodajesz A.
Cos krecisz. W pojedynczej precyzji wg. IEE754 masz 4 bajty, 1 bit znaku, 8 bitow cechy i reszta to mantysa. Cecha jest suma wykladnika potegi liczby 2 i liczby 127 (w celu umozliwienia zapisu liczb ujemnych), przez ktorą nalezy pomnozyć mantyse, aby otrzymac calą liczbe. Ergo _AFAIR_ w celu pomnozenia nalezy sprowadzic przez normalizacje cechy do odpowiedniej pozycji przecinka i dodac mantysy. Ale moge sie mylic bo to dawno na uczelni mialem. W sieci mnostwo jest opisow.
Nikt ci nie każe zapisywać liczb w standardzie IEEE. Dowolną wielkość liczb osiągniesz łatwo dokonując przekształceń na ciągach znaków. Akurat mnożenie jest w miarę proste - tak jakbyś to sam robił zapisując liczby na kartce. A czy liczba będzie miała 10 cyfr, czy 1000 - to już mało istotne. Dla uproszczenia sprawy możesz przed mnożeniem skonwertować obie liczby na całkowite (mnożąc w podanym przypadku przez 10^6) a po operacji przekształcić spowrotem. Można też mnożyć liczby z przecinkiem dziesiętnym albo zapisane w inny sposób (np. hex) - wszystko zależy od twojej inwencji. BTW: Zdaje się, że standardowy unixowy kalkulator 'bc' właśnie używa tekstowych operacji na dowolnie wielkich liczbach.
24 bity mantysy - to tak mniej wiecej wlasnie 7 cyfr dziesietnych.
Ale i tak rzad dokladniej niz tu trzeba na to 1.000002 - ale zabraknie
3 bitow na dokladne tych 98 mln.No coz - trzeba poszukac kompilatora z typem double, albo kombinowac, albo nie wymyslac zadan ktore procka przerastaja ..
J.
Tia, faktetycznie. Pozostaje podwojna precyzja i mozna zrobic to identycznie, w koncu operacje na cechach i mantysach generalnie polegaja na suwaniu bitami to w prawo to w lewo, wiec praktycznie bez znaczenia czy zrobimy to na 8 bajtach czy na 4.
Za pomoca samych rejestrow bedzie trudno, ale jesli w tym procesorze jest jeszcze jakis sumator, to nie bedzie z tym problemu. :-) Sprecyzuj tylko jaka postac maja liczby do pomnozenia: czy format staloprzecinkowy wystarczy, czy tez koniecznie potrzebujesz zmiennego przecinka? W obu przypadkach sprowadzi sie to jednak do pomnozenia dwu duzych liczb naturalnych, co jest prosta operacja, nawet w podstawowce ucza jednego z algorytmow mnozenia. Zamiast niej proponuje jednak algorytm rosyjskich wiesniakow, bo wymaga tylko prostej sekwencji przesuniec i dodawan.
Pozdrawiam Piotr Wyderski
Kompilator o nazwie CrosWare (dla wielu rodzajow prockow) obsluguje typ Double. Tylko ze przydalaby sie pelna wersja, nie trialowa (15dni) i bez ograniczenia dlugosci kodu wynikowego) Pozdrawiam
Have something to add? Share your thoughts — no account required.
Ask the community — no account required