Divisione per due
In matematica, la divisione per due o a metà è stata considerata un'operazione diversa dalla moltiplicazione o divisione per altri numeri fino dai tempi degli antichi egizi, che utilizzavano una tecnica di moltiplicazione che adottava la divisione per due come uno degli elementi fondamentali[1]. Alcuni matematici del tardo sedicesimo secolo continuarono a considerarla come un'operazione distinta dalle altre[2][3], e spesso viene ancora trattata così nella programmazione moderna[4]. La divisione per due è un'operazione semplice da effettuare nell'aritmetica decimale, nel sistema numerico binario usato nella programmazione informatica e in altri sistemi di numerazione basati sui numeri pari.
Sistema numerico binario
[modifica | modifica wikitesto]Nel sistema numerico binario la divisione per due può essere eseguita come un'operazione che sposta il numero (bit shift) di un posto verso destra. Si tratta di un caso di ottimizzazione per riduzione di forza. Per esempio, spostando verso destra di un posto il numero binario 1101001 (che rappresenta il numero decimale 105), si ottiene 110100 (il numero decimale 52): il bit di ordine minore, 1, viene rimosso. Analogamente la divisione per ogni potenza di due 2k può essere eseguita attraverso lo spostamento verso destra di k posizioni. Poiché gli spostamenti di numero sono operazioni molto più veloci delle divisioni, la sostituzione di una divisione con una spostamento può costituire un aspetto importante dell'ottimizzazione. Nell'interesse della portabilità e della leggibilità, tuttavia, è generalmente più opportuno scrivere i programmi usando l'operazione della divisione, confidando nella capacità del compilatore di eseguire le opportune sostituzioni[5].
Questo, tuttavia, non è sempre vero nel caso della divisione dei numeri relativi secondo la rappresentazione binaria. In questo caso lo spostamento verso destra di 1 bit divide sempre per due con un arrotondamento per difetto. In alcuni linguaggi, comunque, la divisione di numeri relativi binari arrotonda verso lo 0 (il che significa un arrotondamento per eccesso se il risultato è negativo). in linguaggio Java, per esempio, -3 / 2
ha come risultato -1
, mentre -3 >> 1
ha come risultato -2
. In questi casi, dunque, il compilatore non può ottimizzare la divisione per due sostituendola con un bit shift, dal momento che il dividendo potrebbe essere negativo.
Virgola mobile
[modifica | modifica wikitesto]Nell'aritmetica binaria in virgola mobile, la divisione per due può essere eseguita diminuendo il valore dell'esponente di uno - a condizione che il risultato non rientri nei numeri denormalizzati. Molti linguaggi di programmazione hanno funzioni che possono essere usate per dividere per due un numero a virgola mobile. Per esempio il Java impiega la funzione java.lang.Math.scalb
[6], mentre il C impiega la funzione ldexp
per il medesimo scopo[7].
Decimali
[modifica | modifica wikitesto]Il seguente algoritmo vale per i numeri decimali, tuttavia può essere utilizzato come modello per la costruzione di un algoritmo che divida per due qualunque numero N con valore di base pari.
- Scrivere il numero N, facendolo precedere da uno zero alla sinistra.
- Procedere lungo le cifre che compongono N a coppie sovrapposte, scrivendo le cifre ricavate dalla tabella seguente:
Se la prima cifra è | Pari | Pari | Pari | Pari | Pari | Dispari | Dispari | Dispari | Dispari | Dispari |
---|---|---|---|---|---|---|---|---|---|---|
E la seconda cifra è | 0 o 1 | 2 o 3 | 4 o 5 | 6 o 7 | 8 o 9 | 0 o 1 | 2 o 3 | 4 o 5 | 6 o 7 | 8 o 9 |
Scrivere | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Esempio: 1738 / 2 = ?
Scrivere 01738 e calcolare il risultato:
- 01: cifra pari seguita da 1, scrivere 0.
- 17: cifra dispari seguita da 7, scrivere 8.
- 73: cifra dispari seguita da 3, scrivere 6.
- 38: cifra dispari seguita da 8, scrivere 9.
Risultato: 0869.
Dall'esempio si ricava che 0 è un numero pari.
Se l'ultima cifra di un numero N è dispari occorre aggiungere 0,5 al risultato.
Note
[modifica | modifica wikitesto]- ^ Jean-Luc Chabert e Évelyne Barbin, A history of algorithms: from the pebble to the microchip, Springer-Verlag, 1999, p. 16, ISBN 978-3-540-63369-3.
- ^ Lambert Lincoln Jackson, The educational significance of sixteenth century arithmetic from the point of view of the present time, Contributions to education, vol. 8, Columbia University, 1906, p. 76..
- ^ E. G. R. Waters, A Fifteenth Century French Algorism from Liége, in Isis, vol. 12, n. 2, 1929, pp. 194-236.
- ^ Kevin R. Wadleigh e Isom L. Crawford, Software optimization for high-performance computing, Prentice Hall, 2000, p. 92, ISBN 978-0-13-017008-8.
- ^ Brian Hook, Write portable code: an introduction to developing software for multiple platforms, No Starch Press, 2005, p. 133, ISBN 978-1-59327-056-8.
- ^ Math.scalb, su Java Platform Standard Ed. 6. URL consultato l'11 ottobre 2009.
- ^ Programming languages - C, International Standard ISO/IEC 9899, 1999., Section 7.12.6.6
Voci correlate
[modifica | modifica wikitesto]- Mediana, il valore che divide in due parti uguali un insieme di dati.
- Bisettrice, il piano, la linea o retta che divide in parti uguali un oggetto geometrico.
- Shift, operazione aritmetica che consiste nello spostare verso destra o verso sinistra la posizione delle cifre di un numero.