2011-11-06 18 views
11

Per essere chiari, non sto cercando NaN o infinito, né mi chiedo quale dovrebbe essere la risposta a x/0. Quello che sto cercando è questo:Qual è il risultato della divisione per zero?

In base a come viene eseguita la divisione in hardware (non so come è fatto), se la divisione dovesse essere eseguita con un divisore di 0, e il processore appena scombussolato felicemente attraverso l'operazione, cosa ne sarebbe uscito?

Mi rendo conto che questo è altamente dipendente dal dividendo, quindi per una risposta concreta chiedo questo: cosa sputerebbe un computer se seguisse la sua operazione di divisione standard su 42/0?

Aggiornamento:

Cercherò di essere un po 'più chiaro. Sto chiedendo le operazioni effettive fatte con i numeri a livello di bit per raggiungere una soluzione. Il risultato dell'operazione è solo bit. NaN e errori/eccezioni entrano in gioco quando il divisore viene scoperto come zero. Se la divisione fosse realmente avvenuta, quali bit sarebbero usciti?

+0

Off-topic: appartiene a http://math.stackexchange.com/ –

+5

NaN verrebbe fuori.Cosa, pensavi che i computer nascondessero il vero risultato da noi? – ceejayoz

+4

@AlastairPitts Sei sicuro? Dal momento che si tratta di come un processore gestirà l'operazione, sembra più adatto per un sito puramente matematico. – yoozer8

risposta

11

Potrebbe non essere sufficiente non arrestare. La divisione intera può essere eseguita in tempo lineare mediante sottrazione ripetuta: per 7/2, è possibile sottrarre 2 da 7 per un totale di 3 volte, quindi questo è il quoziente e il resto (modulo) è 1. Se si fornisse un dividendo 0 per un algoritmo del genere, a meno che non esistesse un meccanismo per impedirlo, l'algoritmo non si fermerebbe: puoi sottrarre 0 da 42 un numero infinito di volte senza mai arrivare da nessuna parte.

Dal punto di vista del tipo, questo dovrebbe essere intuitivo. Il risultato di un calcolo indefinito o non bloccante è ⊥ ("in basso"), il valore indefinito che occupa ogni tipo. La divisione per zero non è definita sugli interi, quindi dovrebbe produrre correttamente ⊥ sollevando un errore o non riuscendo a terminare. Il primo è probabilmente preferibile. ;)

Altri algoritmi di divisione più efficienti (tempo logaritmico) si basano su serie che convergono al quoziente; per un dividendo di 0, per quanto posso dire, questi non riescono a convergere (cioè non riescono a terminare) o producono 0. Vedere Division su Wikipedia.

La divisione in virgola mobile richiede analogamente un caso speciale: per dividere due float, sottrarre i loro esponenti e interi - dividere i loro significati. Stesso algoritmo di base, stesso problema. Ecco perché ci sono rappresentazioni in IEEE-754 per infinito positivo e negativo, così come zero firmato e NaN (per 0/0).

+5

È possibile * eseguire * mediante sottrazione ripetuta, ma non è nella pratica ... –

+0

@OliCharlesworth: Giusto. Stavo modificando per aggiungere una nota su altri algoritmi. –

+0

Anche con una divisione lunga, l'hardware verrà terminato. Effettuerà un numero fisso di fasi. –

8

Per i processori che hanno un'istruzione interna "divide", come x86 con div, la CPU causa effettivamente un interrupt software se si tenta di dividere per zero. Questo interrupt software viene in genere catturato dal runtime della lingua e tradotto in un'apposita eccezione "dividi per zero".

+0

Questo non risponde alla domanda come richiesto. –

+0

Sì, la domanda è stata modificata dalla mia risposta. Ho fatto +1 sulla tua. –

2

Dipende dall'implementazione. Lo standard IEE 754 in virgola mobile [1] definisce i valori infiniti firmati, quindi in teoria dovrebbe essere il risultato della divisione per zero. L'hardware imposta semplicemente un flag se il demoninator è zero su un'operazione di divisione. Non c'è magia ad esso.

Alcune architetture errate (leggere x86) lanciano una trappola se colpiscono una divisione per zero che è, in teoria, da un punto di vista matematico, un poliziotto.

[1] http://en.wikipedia.org/wiki/IEEE_754-2008

+0

No, "da un punto di vista matematico" non puoi dividere per 0. MAI. Semplicemente non è definito. Quello che chiamiamo "infinito" è un simbolo per rappresentare un numero arbitrario di grandi dimensioni che è il risultato della divisione di "qualcosa" di quasi 0 (ma non 0) – Alvaro

1

Sarebbe un ciclo infinito. In genere, la divisione viene eseguita mediante sottrazione continua, proprio come la moltiplicazione viene eseguita tramite aggiunta continua.

Quindi, lo zero è un contenitore speciale poiché tutti sappiamo comunque quale sia la risposta.

+2

Davvero? Moltiplicazione e divisione sono operazioni in tempo lineare? –

1

Sputerebbe effettivamente un'eccezione. Matematicamente, 42/0, non è definito, quindi i computer non sputeranno un valore specifico per questi input. So che la divisione può essere eseguita in hardware, ma l'hardware ben progettato avrà una sorta di flag o interrupt per dirti che qualunque valore contenuto nei registri che dovrebbero contenere il risultato non è valido. Molti computer fanno un'eccezione fuori da questo.

+2

Inoltre, sto scrivendo questo commento per precludere a chiunque di dire che il 42/0 è in realtà infinito. Bestemmia! 42/X tende all'infinito quando X tende a 0, ma il 42/0 è appena indefinito. Grande differenza. –

+0

Totalmente vero, 42/x = oo è solo un simbolo per rappresentare un numero grande arbitrario: "Il risultato cresce man mano che x si avvicina a 0" – Alvaro

5

I divisori hardware utilizzano in genere una struttura pipeline long division.

Supponendo che stiamo parlando di divisione di interi per ora (al contrario di virgola mobile); il primo passo nella lunga divisione è quello di allineare quelli più significativi (prima di tentare di sottrarre il divisore dal dividendo). Chiaramente, questo non è definito nel caso di 0, quindi chissà cosa farebbe l'hardware. Se assumiamo che faccia qualcosa di sano, il passo successivo è eseguire log (n) sottrazioni (dove n è il numero di posizioni di bit). Per ogni sottrazione che risulta in un risultato positivo, viene impostato un 1 nella parola di uscita. Quindi l'output di questo passaggio sarebbe una parola all-1s.

divisione in virgola mobile richiede tre passaggi:

  • Prendendo la differenza degli esponenti
  • punto fisso divisione delle mantisse
  • movimentazione casi particolari

0 è rappresentato da all-0 (sia la mantissa che l'esponente). Tuttavia, c'è sempre un implicito 1 nella mantissa, quindi se non trattassimo questa rappresentazione come un caso speciale, sembrerebbe e agirà come una potenza estremamente piccola di 2.

+0

Non sarei sorpreso se ci fossero alcune macchine in cui un'istruzione dividere per zero sarebbe bloccare l'unità di esecuzione fino a quando un circuito del timer di supervisione non ha riconosciuto un guasto. Aggiungere hardware in modo "pulito" evitando che il tentativo di dividere per zero si blocchi renderebbe un computer più costoso, quindi non sarei sorpreso se alcune macchine non si preoccupassero. – supercat

-1

X/0 Dove X è un elemento di numeri reali ed è maggiore o uguale a 1, quindi la risposta di X/0 = infinito.

metodo Division (C#)

Int Counter = 0; /* used to keep track of the division */ 
Int X = 42;  /* number */ 
Int Y = 0;  /* divisor */ 
While (x > 0) { 
    X = X - Y; 
    Counter++; 
} 
Int answer = Counter; 
+0

"Chiedo informazioni sulle operazioni effettive eseguite con i numeri a livello di bit per raggiungere una soluzione." -OPERAZIONE. – Nenotlep

1

Su x86, interrupt 0 verifica ei registri di uscita sono invariati

Minimal esempio modalità reale a 16 bit (da aggiungere ad un bootloader per esempio):

movw $handler, 0x00 
    movw %cs, 0x02 
    mov $0, %ax 
    div %ax 
    /* After iret, we come here. */ 
    hlt 
handler: 
    /* After div, we come here. * 
    iret 

How to run this code in detail || 32-bit version.

La documentazione Intel per l'istruzione DIV non dice che i registri di output regolari (== risultato, dx == modulo) vengono modificati, quindi penso che questo implichi che rimangono invariati.

Linux gestirà quindi quell'interrupt per inviare un SIGFPE al processo che lo ha eseguito, che lo ucciderà se non viene gestito.