Thread View: pl.comp.lang.asm
8 messages
8 total messages
Started by Remek
Sat, 07 Aug 2010 15:20
Działania na liczbach dziesiętnych "z przecinkiem"
Author: Remek
Date: Sat, 07 Aug 2010 15:20
Date: Sat, 07 Aug 2010 15:20
10 lines
1312 bytes
1312 bytes
Witam Mam napisany kalkulator czterodziałaniowy, który potrafi operować na dużych liczbach. Można nawet używać dzielnika 128 bajtowego. Nie potrafi jednak operować na liczbach w postaci ułamka dziesiętnego np. 12,123. Usiłuję napisać jakieś zgrabne procedury, ale nie wychodzi na razie. Chodzi o instrukcje procesora, bez użycia koprocesora. Czy ktoś może bawił się w takie coś i moze dać wskazówkę, albo namiar? Remek
Re: Działania na liczbach dziesiętnych "z przecinkiem"
Author: Michoo
Date: Sun, 08 Aug 2010 08:51
Date: Sun, 08 Aug 2010 08:51
13 lines
1191 bytes
1191 bytes
Remek pisze: > Witam > > Mam napisany kalkulator czterodziałaniowy, który potrafi operować na dużych > liczbach. Można nawet używać dzielnika 128 bajtowego. Nie potrafi jednak > operować na liczbach w postaci ułamka dziesiętnego np. 12,123. Ale może byś wyjaśnił jaką masz reprezentację liczb i jak chcesz reprezentować te ułamki? -- Pozdrawiam Michoo
Re: Działania na liczbach dziesiętnych "z przecinkiem"
Author: Remek
Date: Sun, 08 Aug 2010 10:33
Date: Sun, 08 Aug 2010 10:33
35 lines
1931 bytes
1931 bytes
Użytkownik "Michoo" napisał: > Ale może byś wyjaśnił jaką masz reprezentację liczb i jak chcesz > reprezentować te ułamki? Przepraszam, że nie podałem więcej danych. Program jest pod Windows z interfejsem okienkowym. Liczby wpisuję do kontrolek i w kontrolkach wyświetlam wyniki. W razie potrzeby mogę gdzieś wrzucić screen. Obróbkę z ASCII na hex i na odwrót mam zrobioną. Chodzi tylko o procedury wykrywania przecinka i odpowiedniej na to reakcji. Moja wstępna koncepcja wygląda następująco: - w trakcie czytania kontrolki do bufora wykrywam przecinek i pomijam go. - liczę ilość miejsc po przecinku. - dopasowuję odpowiednio wczytane liczby. Jeśli ma być wykonane dodawanie to: - wpisane argumenty: 12345,77 + 2876,345 - po obróbce: 12345770 + 2876345 Konwertuję to na hex, dodaję. Następnie wykonuję operację odwrotną tzn. konwersję na dec i do wyniku dodaję przecinek: 15222,115 Pozdrawiam Remek
Re: Działania na liczbach dziesiętnych "z przecinkiem"
Author: Bernard
Date: Sun, 08 Aug 2010 17:07
Date: Sun, 08 Aug 2010 17:07
35 lines
2238 bytes
2238 bytes
On 2010-08-08 12:33, Remek wrote: > Użytkownik "Michoo" napisał: > >> Ale może byś wyjaśnił jaką masz reprezentację liczb i jak chcesz >> reprezentować te ułamki? > > Przepraszam, że nie podałem więcej danych. Program jest pod Windows z > interfejsem okienkowym. Liczby wpisuję do kontrolek i w kontrolkach > wyświetlam wyniki. W razie potrzeby mogę gdzieś wrzucić screen. Obróbkę z > ASCII na hex i na odwrót mam zrobioną. Chodzi tylko o procedury wykrywania > przecinka i odpowiedniej na to reakcji. Moja wstępna koncepcja wygląda > następująco: > > - w trakcie czytania kontrolki do bufora wykrywam przecinek i pomijam go. > - liczę ilość miejsc po przecinku. > - dopasowuję odpowiednio wczytane liczby. > > Jeśli ma być wykonane dodawanie to: > > - wpisane argumenty: > > 12345,77 > + 2876,345 > > - po obróbce: > > 12345770 > + 2876345 > > Konwertuję to na hex, dodaję. Następnie wykonuję operację odwrotną tzn. A po co na hex? Reprezentacja w postaci cyfr dziesiętnych (ASCII) jest cakiem odpowiednia dla takiego kalkulatora.
Re: Działania na liczbach dziesiętnych "z przecinkiem"
Author: Remek
Date: Sun, 08 Aug 2010 20:00
Date: Sun, 08 Aug 2010 20:00
13 lines
1336 bytes
1336 bytes
Użytkownik "Bernard" napisał: > A po co na hex? > Reprezentacja w postaci cyfr dziesiętnych (ASCII) jest cakiem > odpowiednia dla takiego kalkulatora. Widocznie czegoś nie wiem. Mógłbys podać przykład kodu dla procesora x86, który wykona działanie i poda prawidłowy wynik? 3132 * 32 = 3234 (w ASCII) Remek
Re: Działania na liczbach dziesiętnych "z przecinkiem"
Author: Michoo
Date: Sun, 08 Aug 2010 20:41
Date: Sun, 08 Aug 2010 20:41
42 lines
2333 bytes
2333 bytes
Remek pisze:
> Użytkownik "Bernard" napisał:
>
>> A po co na hex?
>
>> Reprezentacja w postaci cyfr dziesiętnych (ASCII) jest cakiem
>> odpowiednia dla takiego kalkulatora.
>
> Widocznie czegoś nie wiem. Mógłbys podać przykład kodu dla procesora x86,
> który wykona działanie i poda prawidłowy wynik?
>
> 3132 * 32 = 3234 (w ASCII)
struct num{
uint16_t len;
uint8_t *data;
};
data zawiera wartości 0-9, na ascii zamienia się tylko do wyświetlenia,
kolejność: od lewej do prawej. wykonujesz na tym mnożenie pisemne - nie
jest to specjalnie wydajne, ale sprawdza się do kalkulatora całkiem nieźle.
Pseudokod:
num mul(num *a,num *b){
num c;
c.data = malloc(a->len+b->len);
memset(c->data,0,a->len+b->len);
for(int i=0;i<a->len;i++)
for(int j=0;j<b->len;j++)
add(c->data+i,(a->data[i]*(uint16_t)b->data[j]));
c->len=len(c->data,a->len+b->len);
c->data = realloc(c->data,c->len);
return c;
}
Musisz sprawdzić, czy nie ma błędów i skompilować.
len zwraca ile bajtów zajął wynik w rzeczywistości - liczy się przez
przeglądanie od końca tablicy tak długo jak zawiera zera i odjęcie od
początkowego rozmiaru.
add dodaje wynik pojedynczego mnożenia do wyniku częściowego (trzeba
dodać dwa bajty i rozpropagować ewentualne przepełnienie)
--
Pozdrawiam
Michoo
Re: Działania na liczbach dziesiętnych "z przecinkiem"
Author: Remek
Date: Mon, 09 Aug 2010 11:16
Date: Mon, 09 Aug 2010 11:16
22 lines
1594 bytes
1594 bytes
Użytkownik "Michoo" napisał:
> struct num{
> uint16_t len;
> uint8_t *data;
> };
> data zawiera wartości 0-9, na ascii zamienia się tylko do wyświetlenia,
> kolejność: od lewej do prawej. wykonujesz na tym mnożenie pisemne - nie
> jest to specjalnie wydajne, ale sprawdza się do kalkulatora całkiem
nieźle.
>
> Pseudokod:
> num mul(num *a,num *b){
.............
To jest asembler??? Czy powyższa procedura przewiduje dzielenie? Wstawia
przecinki we właściwe miejsca?
123,33 / 321,44
Remek
Re: Działania na liczbach dziesiętnych "z przecinkiem"
Author: Michoo
Date: Mon, 09 Aug 2010 12:13
Date: Mon, 09 Aug 2010 12:13
39 lines
2306 bytes
2306 bytes
Remek pisze:
> Użytkownik "Michoo" napisał:
>
>> struct num{
>> uint16_t len;
>> uint8_t *data;
>> };
>> data zawiera wartości 0-9, na ascii zamienia się tylko do wyświetlenia,
>> kolejność: od lewej do prawej. wykonujesz na tym mnożenie pisemne - nie
>> jest to specjalnie wydajne, ale sprawdza się do kalkulatora całkiem
> nieźle.
>> Pseudokod:
>> num mul(num *a,num *b){
>
> .............
>
> To jest asembler???
Nie - to jest pesudokod C-like. Skompilowanie go nie jest chyba żadnym
problemem? Ale należy uwzględnić wiele warunków - jakie rejestry używasz
do czego, czy to ma być PIC, czy nie, etc. tak jest imo czytelniej.
> Czy powyższa procedura przewiduje dzielenie?
Powyższa funkcja służy do mnożenia. Ja robiłem dzielenie za pomocą
wyszukiwania binarnego, ale są sprytniejsze metody. Dopóki nie
zdecydujesz się skorzystać z takiego zapisu nie ma chyba sensu się o tym
rozpisywać. Ogólnie chodzi o działania jak w podstawówce, ale w
reprezentacji od lewej do prawej.
Wstawia
> przecinki we właściwe miejsca?
Przy zapisie dziesiętnym wstawianie przecinków po mnożeniu ogranicza się
do zsumowania ich pozycji w obu czynnikach. Przy dzieleniu pozycja jest
znana.
--
Pozdrawiam
Michoo
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads