🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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"
#2366
Author: Remek
Date: Sat, 07 Aug 2010 15:20
10 lines
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"
#2367
Author: Michoo
Date: Sun, 08 Aug 2010 08:51
13 lines
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"
#2368
Author: Remek
Date: Sun, 08 Aug 2010 10:33
35 lines
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"
#2371
Author: Bernard
Date: Sun, 08 Aug 2010 17:07
35 lines
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"
#2369
Author: Remek
Date: Sun, 08 Aug 2010 20:00
13 lines
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"
#2370
Author: Michoo
Date: Sun, 08 Aug 2010 20:41
42 lines
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"
#2372
Author: Remek
Date: Mon, 09 Aug 2010 11:16
22 lines
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"
#2373
Author: Michoo
Date: Mon, 09 Aug 2010 12:13
39 lines
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