Newsgroup: it.scienza.informatica
Titolo: Divisione per 20 ...complicata!

Ciao a tutti
Problemino.
Devo programmare un componente hardware che ha un sub-assembler.
Il problema (matematico) è questo. Devo fare una divisione per 20, senza
avere l'operatore di divisione!
In pratica, il mio assembler prevede la sola divisione (o moltiplicazione)
per potenze di due.
Come posso fare? Suggerimenti?
Ciao e grazie
Marco
--------------------------------
Inviato via 
http://usenet.libero.it

ho sbagliato a scrivere le formule:
1/20 è come dividere per 4 e poi per 5.allora 1/5=0.2 e cerco di
ottenere 0.2come somma di 1/2allaN, ad esempio 1/8 + 1/16 + 1/64...
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 per potenze di due.
secondo me basta del buonsenso e un po' di conti:
innanzitutto credo che si vada solo per approssimazioni (in 2 minuti non
mi è venuto in mente altro)
poi bisogna vedere con che numeri tu lavori e di che precisione hai
bisogno, questi sono i parametri che ti permettono di scegliere fra le
diverse approssimazioni possibili.
l'idea semplice semplice è di scrivere 1/20 = 1/32 + 1/16 + 1/64 ad
esempio (per eccesso, 1/128 per difetto) e di vedere come va
ti viene in mente taylor o altre cose? ben venga,direi che si gira lì
attorno :)
ciao, buon lavoro
(se posti info + specifiche possoprovarea fare conti + precisi)
virgilio


 Come posso fare? Suggerimenti?
Con le divisioni non te la cavi, perché 20 contiene quel fattore 5 che non
puoi gestire con gli shift a destra (divisione per potenza di due) o a
sinistra (moltiplicazione per potenza di due).
Penso che non hai alternativa a risolvere il problema per sottrazioni
successive, a patto che, come mi sembra di capire, devi fare una divisione
tra numeri interi. Ti riporto il pezzo di algoritmo in linguaggio C: non
dovresti avere problemi a tradurlo nel tuo assembler:
...
int quoziente;
int resto;
int dividendo;
quoziente = 0;
while (dividendo >= 20) {
   dividendo = dividendo - 20;
   quoziente = quoziente + 1;
}
resto = quoz;
...

 Come posso fare? Suggerimenti?
Con le divisioni non te la cavi, perché 20 contiene quel fattore 5 che non


 resto = quoz;
resto=dividendo !
Comunque quella che hai proposto e' la soluzione migliore... e' l'unica vera
divisione fra numeri interi...
Usavo quest'algoritmo quando programmavo con il 6502 !! (la cpu
dell'appleII, vent'anni fa...)
Ciao e grazie per i bei ricordi che mi hai evocato...

 divisione fra numeri interi...
Scusate se sembro pignolo, ma state dicendo delle cose assolutamente
*FALSE*. (Vi correggo solo perche' qualche giovane potrebbe essere
fuorviato.... :-)
Anche io ho programmato a suo tempo le cpu della famiglia 6502
che appunto ha solo shift binario e non moltiplicazione o divisione.
*Il metodo delle sottrazioni ripetute non e' assolutamente LA*
*soluzione migliore e nemmeno l'unica vera divisione tra numeri interi.*
Basta pensare a cosa vuol dire dividere un numero di 4 byte, diciamo
1 miliardo, per 20. Ci vogliono 50 milioni di loop !! Mi sembra un po'
tantino.... considerando che le prime 6502 andavano a 1 o 2 MHz ci
sarebbero voluti minimo minimo 50 secondi per fare una divisione....
Quindi il metodo delle sottrazioni ripetute va bene solo se il rapporto
tra dividendo e divisore e' piccolo, per esempio quando dividendo e
divisore sono lunghi 1 byte.
In tutti gli altri casi si usa un mix di shift binari e sottrazioni.
In pratica si fa la divisione classica che ci insegnano a scuola,
solo con i numeri binari. Il vantaggio dei numeri binari e' che la
successiva cifra del risultato che stiamo cercando puo' essere solo
0 o 1. Per allineare i numeri da confrontare e
sottrarre si usa appunto lo shift binario. Le operazioni da fare
comunque dipendono abbastanza dal processore. Non e' un algoritmo
che si improvvisa su due piedi, comunque e' molto diffuso (non sei il
primo a dover fare una divisione...) e sicuramente lo trovi in rete.
(Se io avessi ancora sottomano il disassemblato del Basic del commodore
64 potrei anche copiarti la routine per la divisione di interi che era
implementata li, peccato.)
Ciao,
g.

Il 10 Mar 2003, 15:30, n...@spam.please (Marco) ha scritto:
Ciao a tutti.
Rispondo qui a tutti: grazie per le risposte.
In effetti ho detto un po' poco del mio "oggetto": è un micro che ha 6 word
di RAM, 3 registri, tutti accessibili a word.
Il calcolo che mi serve è di tipo intero (non fixed point, proprio numeri
interi ...)
Grazie dei suggerimenti, ancora.



Basta cercare  con Google: "6502 division" -> mi sento fortunato ->
http://www.6502.org/source/integers/ummodfix/ummodfix.htm
Per chi è pratico dello Z80 (come me):
http://zilog.sh.cvut.cz/~baze/misc/z80bits.html

 avere l'operatore di divisione........
posso inviarti 5 pagine dell' Hamacher che trattano un possibile circuito
che usa l'algoritmo di cui ti parla Giovanni Resta nella sua risposta...
credo le troveresti interessanti... dammi un indirizzo mail dove
spedirtele...
ciao ^___^
                                    §aigon
---------->>   portatore sano di ignoranza   <<----------

 
http://www.6502.org/source/integers/ummodfix/ummodfix.htm
Bellissimo! Non sapevo che ci fosse ancora tanta gente interessata
al (imho superbo) 6502.
Ah, che nostalgia....
ciao,
g.

 Come posso fare? Suggerimenti?
Vabbe`, forse e` troppo specifico, comunque
ti segnalo
Peter Clote and Evangelos Kranakis, Boolean Functions and Computation Models, 
sez. 1.7.2 e 1.7.3., pagg.
E' un libro, se lo vuoi comprare c'e' pure su amazon, se vuoi scaricare un 
preprint c'e' sulla pagina
http://www.mathematik.uni-muenchen.de/~logik/papers/contents_g.html
dove c'e' un avvertimento in tedesco che immagino si debba leggere, il libro 
(in inglese) e` a questo indirizzo
http://www.mathematik.uni-muenchen.de/~logik/papers/clotekranakis/CloteKranakis00.ps.gz
giorgio