2010-06-17 11 views
19

Come un computer esegue una moltiplicazione su 2 numeri dice 100 * 55.Come il computer moltiplica 2 numeri?

La mia ipotesi era che il computer ha aggiunto ripetute per ottenere la moltiplicazione. Naturalmente questo potrebbe essere il caso per i numeri interi. Tuttavia per i numeri in virgola mobile deve esserci qualche altra logica.

Nota: questo è stato chiesto in un'intervista.

+4

ovviamente no, controlla [algoritmo di moltiplicazione] (http://en.wikipedia.org/wiki/Multiplication_algorithm) –

+0

Quindi intendi dire che, a seconda della lunghezza o del valore dei numeri, verranno utilizzati diversi algoritmi. – ckv

risposta

21

L'aggiunta ripetuta sarebbe un modo molto inefficiente per moltiplicare i numeri, immagina di moltiplicare 1298654825 per 85324154. Molto più veloce usare semplicemente la moltiplicazione lunga usando il binario.

1100100 
0110111 
======= 
0000000 
-1100100 
--1100100 
---0000000 
----1100100 
-----1100100 
------1100100 
============== 
1010101111100 

Per i numeri in virgola mobile notazione scientifica viene utilizzato.

100 is 1 * 10^2 (10 to the power of 2 = 100) 
55 is 5.5 * 10^1 (10 to the power of 1 = 10) 

moltiplicarli insieme moltiplicano le mantisse e aggiungere gli esponenti

= 1 * 5.5 * 10^(2+1) 
= 5.5 * 1000 
= 5500 

Il computer fa questo utilizzando gli equivalenti binari

100 = 1.1001 * 2^6 
55 = 1.10111* 2^5 
-> 1.1001 * 1.10111 * 2^(6+5) 
10

Il metodo che viene usato solitamente viene chiamato prodotti parziali come gli umani, così per esempio avere 100*55 sarebbe fare qualcosa di simile

100 X 
    55 
---- 
    500 + 
500 
---- 

In pratica, i vecchi approcci utilizzavano un algoritmo di spostamento e accumulo in cui si mantiene la somma mentre si sposta il prodotto parziale s per ogni cifra del secondo numero. L'unico problema di questo approccio è che i numeri sono memorizzati in complemento a 2, quindi non è possibile fare una semplice moltiplicazione bit per bit durante lo spostamento.

Oggigiorno la maggior parte dell'ottimizzazione è in grado di sommare tutti i parziali in un solo ciclo consentendo di avere un calcolo più rapido e una più facile parallelizzazione.

Date un'occhiata qui: http://en.wikipedia.org/wiki/Binary_multiplier

Alla fine si possono trovare alcune implementazioni come

+0

Quindi non esiste un modo o un algoritmo utilizzato in un processore in un computer. a seconda dei dati è selezionato un algoritmo diverso. Perfavore, correggimi se sbaglio. – ckv

+0

Anche in questo modo, devi ancora moltiplicare 100x5 due volte no? – bragboy

+0

In decimale devi moltiplicare 100 * 5 e 10 * 5, ma in binario moltiplichi per 1 o 0, il che significa che lo aggiungi o non lo fai. –

3

Un modo sta usando lunga moltiplicazione , in bina ry:

 01100100 <- 100 
    * 00110111 <- 55 
    ---------- 
     01100100 
     01100100 
    01100100 
    01100100 
    01100100 
--------------- 
    1010101111100 <- 5500 

Questo è talvolta chiamato il metodo shift and add.

3

I computer utilizzano l'algoritmo di Booth o altri algoritmi che eseguono lo spostamento e l'aggiunta per operazioni aritmetiche. Se avessi studiato i corsi di architettura informatica, i libri sull'architettura dei computer dovrebbero essere un buon posto per studiare questi algoritmi.

1

La risposta è, dipende. Come altri hanno sottolineato, è possibile utilizzare lo stesso algoritmo insegnato a scuola, ma utilizzando invece il binario. Ma per i piccoli numeri ci sono altri modi.
Supponiamo che tu voglia moltiplicare due numeri a 8 bit, questo può essere fatto con una grande tabella di ricerca. Basta concatenare i due numeri a 8 bit per formare un numero a 16 bit e usare quel nunber per indicizzare in una tabella con tutti i prodotti.
Oppure, puoi semplicemente avere una grande rete di porte che calcola la funzione in modo diretto. Tuttavia, queste reti gate tendono ad essere piuttosto ingombranti per la moltiplicazione di grandi numeri.

1

per moltiplicare due numeri in virgola mobile il seguente procedimento:

  1. Moltiplicare mantisse
  2. Aggiungere gli esponenti
  3. Normalizza il risultato (punto decimale viene dopo la prima cifra non zero)

Quindi, in base 10 per moltiplicare 5.1E3 e 2.6E-2

Multip Ly le mantisse => 5.1 * 2.6 = 13.26 (NB questo può essere fatto con la moltiplicazione intero fino a quando si traccia dove il punto decimale dovrebbe essere)

Aggiungi gli esponenti => 3 + -2 = 1

ci dà un risultato di 13.26E1

Normalizzare 13.26E1 => 1.326E2

1

ho solo il codice di un semplice programma moltiplicare due numeri memorizzati in 2 righe nel file usando l'algoritmo lunga moltiplicazione Si può moltiplicare due numeri che hanno più di 1 miliardo di numero in ogni altra

Esempio: codice

  23958233 
      5830 × 
     ------------ 
      00000000 (=  23,958,233 ×  0) 
      71874699 (=  23,958,233 × 30) 
      191665864 (=  23,958,233 × 800) 
     119791165 (=  23,958,233 × 5,000) 

Fonte:

Si prega di rivedere e dare il tuo commento http://code.google.com/p/juniormultiply/source/browse/#svn/trunk/src

Problemi correlati