Come avviene la divisione nei nostri computer?


17

Come avviene la divisione all'interno dei computer digitali? A cosa serve l'algoritmo?

Ho cercato molto su Google, ma non ho ottenuto risultati soddisfacenti. Fornire un algoritmo / diagramma di flusso molto chiaro per l' algoritmo di divisione con un'illustrazione di esempio.


1
La divisione @ program-o-steve in una ALU è un'operazione complessa. Non otterrai un diagramma di flusso "semplice".
Majenko,

5
@ Leon Heller Oh! Non è così. Questa è una pura domanda hardware
program-o-steve,

2
@ Leon Heller Immagino che non sia ...., che include elettronica, elaborazione fisica ...
program-o-steve,

2
La divisione nei microcontrollori non è semplice. Ci sono modi veloci e modi lenti per farlo. I modi lenti sono più facili da capire, ma i modi rapidi sono utilizzati nelle CPU moderne che cosa vuoi sapere specificamente? Vuoi solo una comprensione di base dei principi o un'analisi dettagliata delle CPU moderne?
Konsalik,

4
@LeonHeller Di solito sono d'accordo con le domande che vuoi chiudere, ma il design della CPU è molto una questione di ingegneria elettrica. Questa domanda potrebbe usare un po 'di aiuto per rendere molto più chiaro ciò che si desidera (come ciò che konsalik sta chiedendo), ma ciò non lo rende fuori tema.
Kellenjb,

Risposte:


17

Gli algoritmi di divisione nei progetti digitali possono essere suddivisi in due categorie principali. Divisione lenta e divisione rapida.

Ti suggerisco di leggere come funzionano l'aggiunta e la sottrazione binarie se non hai ancora familiarità con questi concetti.

Divisione lenta

I metodi lenti più semplici funzionano tutti nel modo seguente: Sottrai il denominatore dal numeratore. Fatelo in modo ricorsivo con il risultato di ciascuna sottrazione fino a quando il resto non sarà inferiore al denominatore. La quantità di iterazioni è il quoziente intero e la quantità rimasta è il resto.

Esempio:

7/3:

  1. 73=4
  2. 43=1
  3. 1<3

Quindi la risposta è 2 con un resto di 1. Per rendere questa risposta un po 'più pertinente, ecco alcuni retroscena. Viene eseguita la sottrazione binaria mediante aggiunta del negativo, ad es .: 7 - 3 = 7 + (-3). Ciò si ottiene utilizzando il complemento a due. Ogni numero binario viene aggiunto utilizzando una serie di additivi completi:

inserisci qui la descrizione dell'immagine

Dove ogni sommatore completo a 1 bit viene implementato come segue:

inserisci qui la descrizione dell'immagine

Divisione veloce

Sebbene il metodo di divisione più lento sia di facile comprensione, richiede ripetute iterazioni. Esistono vari algoritmi "veloci", ma tutti si basano sulla stima.

Considera il metodo Goldschmidt:

Q=ND

Questo metodo funziona come segue:

  1. Moltiplica N e D con una frazione F in modo che D si avvicini a 1.
  2. Mentre D si avvicina a 1, N si avvicina a Q

Questo metodo utilizza la moltiplicazione binaria tramite aggiunta iterativa, utilizzata anche nelle moderne CPU AMD.


1
Alcuni diagrammi di flusso per le variazioni del metodo "lento" (implementato nell'assemblaggio su micro senza divisione hardware, ma ancora utile) sono riportati nell'appendice AVR200 di Atmel .
Kevin Vermeer,

puoi per favore dare un'illustrazione sul metodo di divisione di Goldschmidt. Anche il diagramma di flusso fornito qui è un esempio di divisione lenta?
program-o-steve,

qual è quel metodo in cui dobbiamo spostare ripetutamente il dividendo a sinistra?
program-o-steve,

@ program-o-steve Ecco una breve illustrazione: trova 22/7 (approssimazione pi). Innanzitutto, moltiplica in alto e in basso per 0,1 per ottenere: 2,2 / 0,7 Moltiplica di nuovo, usando 1,3, dando: 2,86 / 0,91 Usando 1,09 dà: 3,1174 / 0,9919 1,008 dà: 3,1423393 / 0,9998352 Continua, raggiungerai presto RISPOSTA FINALE 3.1428571 / 1.000000 ...
Alan Campbell,

Come si "moltiplica per una frazione"? Le frazioni non sono rappresentabili in virgola mobile. Una frazione per definizione è il numeratore diviso per il denominatore, quindi ti viene lasciato in un argomento circolare di dover ancora dividere. E come si può stimare quella frazione in primo luogo?
CogitoErgoCogitoSum

4

L'hardware per la divisione in virgola mobile fa parte di un'unità logica che esegue anche la moltiplicazione; è disponibile un modulo hardware moltiplicatore. I numeri in virgola mobile, ad esempio A e B, sono divisi (formando A / B) per

  1. scomporre i numeri in virgola mobile in esponenti di segno (+1 o -1), mantissa ("a" e "b" e (tipo intero binario)
  2. il segno del risultato è (+1) se entrambi i segni sono uguali, altrimenti (-1)
  3. gli esponenti vengono sottratti (esponente di B sottratto dall'esponente di A) per formare l'esponente del risultato
  4. le mantisse (le cifre binarie dei numeri) sono un numero binario a virgola fissa compreso tra 1/2 e 1; ciò significa che la prima cifra dopo il punto binario è '1', seguita da zero e uno ... come primo passo, una tabella di ricerca trova il reciproco preciso a sei bit (ci sono solo 32 possibilità, è una piccola tabella)

  5. per iniziare a calcolare a / b, fai due moltiplicazioni

    un'B=un'*recioprocun'l(B)B*recioprocun'l(B)
    e nota che l'accuratezza a sei bit implica che il denominatore del risultato è molto vicino a 1 (a cinque o più posizioni binarie).

  6. Ora nota che per i denominatori molto vicini a uno, 'd', possiamo vedere che la definizione
    d==1+ε
    d*(2-d)=(1+ε)×(1-ε)=1-ε2
    Ciò implica che il nostro "uno" accurato a cinque bit nel denominatore diventerà accurato a dieci bit dopo un'altra coppia di moltiplicazioni, accurato a venti bit dopo due e accurato a quaranta bit dopo tre. Esegui quante più iterazioni di numeratore e denominatore moltiplicando per (2 - denominatore) quanto richiede la precisione del risultato.
  7. Il numeratore, ora che il denominatore è esattamente "1", è la mantissa del risultato e può essere combinato con il segno e l'esponente precedentemente calcolati.
  8. Il virgola mobile IEEE consente alcune eccezioni (numeri denormalizzati, NAN; quelli devono essere gestiti da altre operazioni logiche.

È interessante notare che il vecchio bug di divisione Pentium (molto degno di nota nel 1994) è stato causato da un errore di stampa che ha reso errati i valori della tabella reciproca per il passaggio (4). Un primo documento, "Un metodo di divisione che utilizza un moltiplicatore parallelo", Domenico Ferrari, IEEE Trans. Electron. Comput. EC-16 / 224-228 (1967), descrive il metodo, così come "The IBM System / 360 Model 91: Floec-Point Execution Unit" IBM J. Res. Dev. 11 : 34-53 (1967).


1

Esistono metodi molto diversi per la divisione, a seconda dei numeri da gestire. Per i numeri interi, il metodo di spostamento e sottrazione fornito da altri funzionerà correttamente. Per i numeri in virgola mobile, tuttavia, potrebbe essere più rapido calcolare prima il reciproco del denominatore e quindi moltiplicarlo per il numeratore.

Il calcolo del reciproco del denominatore non è poi così male; viene fatto perfezionando le approssimazioni successive. Lascia che sia la tua ipotesi per 1 / d. Per un'ipotesi migliorata, usa g '= g (2-gd). Questo converge quadraticamente, quindi raddoppi le cifre della precisione su ogni miglioramento.

Esempio: calcolare il reciproco di 3.5.

La tua ipotesi iniziale è 0,3. Si calcola 0,3 * 3,5 = 1,15. L'ipotesi modificata è 0,3 * (2 - 1,15) = 0,285. Già abbastanza vicino! Ripeti il ​​processo e otterrai 0,2857125 e un terzo tentativo ottiene 0,2857142857.

Ci sono alcune scorciatoie. In virgola mobile, è possibile estrarre potenze di dieci o potenze di due, a seconda della base numerica della macchina. E, per aumentare la velocità a scapito di un maggiore utilizzo della memoria, è possibile utilizzare una tabella pre-calcolata per i numeri nell'intervallo da 1 a b (dove b è la base numerica) per ottenere un'ipotesi che è immediatamente vicina al reciproco richiesto e salva una o due fasi di perfezionamento.

Tieni presente che, come per la moltiplicazione e l'imbarazzo di Kolmogorov del 1960 da parte del suo studente Anatoly Karatsuba, non sai mai quando verrà trovato un metodo più veloce o migliore. Non arrenderti mai alla tua curiosità.


-1

I computer non fanno un'aggiunta iterativa per moltiplicare i numeri - sarebbe molto lento. Al contrario, ci sono alcuni algoritmi di moltiplicazione rapida. Scopri: http://en.wikipedia.org/wiki/Karatsuba_algorithm


Benvenuti in EE.SE. Le risposte solo al collegamento sono scoraggiate. Riassumi le informazioni nel link.
Null

Loro fanno. Tonnellate di CPU non hanno ancora moltiplicatori a ciclo singolo e usano la mutiplicazione software.
user3528438
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.