2012-08-17 22 views
7

Poiché i computer pensano in termini di "1" e "0" come calcolano e rappresentano frazioni come 7.50? Conosco Java e JavaScript e se necessario per la risposta è possibile utilizzarli come esempio.Come vengono rappresentate le frazioni nei computer?

Edit: che c'è in questo MIT video on hashing by Prof. Cormen a 46:31 secondi spiega la funzione di moltiplicazione hash utilizzando una ruota modulare che è un cerchio unitario con diversi punti in essa ei punti denotano frazioni. Questo mi ha spinto a porre questa domanda di base qui in SO.

+0

[Qui] (http://stackoverflow.com/questions/474535/best-way-to-represent-a-fraction-in-java) –

risposta

10

Il modo più comune per rappresentare numeri diversi dagli interi nei computer è utilizzando il punto mobile, in particolare il punto mobile IEEE 754. Come è noto, gli interi sono comunemente rappresentati usando bit hardware per rappresentare numeri binari, quindi le proprietà fisiche (come carica o mancanza di carica, alta tensione o bassa tensione, un campo magnetico in una direzione o un'altra) sono usate per rappresentano i bit (0 e 1), e una sequenza di quei bit rende un numero (come 11010), che interpretiamo in binario per rappresentare un numero (11010 è 16 + 8 + 2 = 26). Di solito non ci pensiamo, ma c'è un "punto di radiazione" a destra di questo numero: "11010." Abbiamo solo bisogno del punto di radix quando abbiamo più bit a destra di esso, che rappresentano le frazioni. Ad esempio, 11010.11 è 16 + 8 + 2 + 1/2 + 1/4 = 26,75. Per passare da interi a virgola mobile, facciamo galleggiare il punto radix. Oltre ai bit che rappresentano il numero, abbiamo alcuni bit aggiuntivi che ci dicono dove posizionare il punto di radix.

Quindi, potremmo avere tre bit, ad esempio 010, per dire dove va il punto di radix e altri bit, ad esempio 1101011, per rappresentare il valore. I bit del punto di radiazione, 010, potrebbero dire di spostare il punto radix di due posizioni a sinistra, cambiando "1101011." in "11010.11".

In IEEE 754 a precisione singola, c'è un bit di segno (che indica + o -), otto bit di esponente e 23 bit di valore (per "significante" o "frazione"). I valori 0 e 255 dei bit di esponente sono speciali.Per altri valori dei bit di esponente, sottraiamo 127 per ottenere esponenti che vanno da -126 (sposta il punto di radix 126 bit a sinistra) a 127 (sposta il punto di radiazione di 127 bit a destra). Il significato e i bit sono interpretati come un numero binario, salvo che li modifichiamo un po ': scriviamo "1", quindi un punto di radix, quindi i 23 bit del significando, quindi abbiamo qualcosa come "1.1101011000 ...". In alternativa, puoi pensare a questo come un intero: "1" quindi 23 bit senza nessun punto di radix inserito, creando un numero binario a 24 bit, ma l'esponente è regolato da un extra 23 (quindi sottrarre 150 anziché 127) .

In IEEE 754 a precisione doppia, vi è un bit di segno, 11 bit di esponente e 52 bit di significato.

Esistono altri formati in virgola mobile, che sono meno comuni. Alcuni più vecchi usano l'esadecimale come base (usando l'esponente per indicare spostamenti di quattro bit invece di uno). Un importante tipo di formato a virgola mobile è decimale, in cui l'esponente indica il potere di 10. In virgola mobile decimale, il significato e può essere un numero intero binario o può essere un numero decimale codificato in codice binario (dove ogni quattro bit indica una cifra decimale) o può essere un ibrido (i gruppi di bit sono usati per indicare un piccolo numero di cifre decimali secondo uno schema personalizzato).

Una proprietà importante dei numeri in virgola mobile è che non possono rappresentare tutti i numeri reali (anche in un intervallo finito, ovviamente) o anche tutti i numeri razionali. Questo costringe le operazioni matematiche a restituire i risultati arrotondati a numeri rappresentabili, il che non pone fine a problemi per le persone che non hanno familiarità con il funzionamento con virgola mobile. Questa proprietà diventa a sua volta una caratteristica di virgola mobile decimale: è utile per lavorare con denominazioni di valuta e altri numeri associati all'uomo che di solito vengono manipolati in decimali, poiché la maggior parte degli errori di arrotondamento può essere eliminata mediante un uso attento del punto decimale mobile. Scienziati e matematici, che lavorano di più con numeri naturali o con numeri puri invece di numeri contaminati dall'uomo, tendono a preferire il punto di virgola mobile, perché è più ampiamente disponibile ed è ben supportato dall'hardware.

Esistono altri modi per rappresentare numeri non interi nei computer. Un altro metodo comune è il punto fisso. In punto fisso, una sequenza di bit, come 1101011, viene interpretata con un punto di radix in una posizione nota e fissa. La posizione verrebbe fissata in una posizione utile per un'applicazione specifica. Quindi i bit 1101011 potrebbero rappresentare il numero 11010.11 . Un vantaggio del punto fisso è che è facilmente implementabile con l'hardware standard. Per aggiungere due numeri a virgola fissa, li aggiungiamo semplicemente come se fossero numeri interi. Per moltiplicare due numeri a virgola fissa, li moltiplichiamo come se fossero numeri interi, ma il risultato ha il doppio delle posizioni dopo il punto di radix, quindi spostiamo i bit per regolare per questo o scriviamo il nostro codice in modo che i risultati di tali operazioni vengono interpretate con il numero noto di bit dopo il punto di radix. Alcuni processori hanno istruzioni per supportare il punto fisso regolando le moltiplicazioni per questo effetto.

I numeri possono anche essere ridimensionati in numeri interi. Ad esempio, per lavorare con la valuta degli Stati Uniti, semplicemente moltiplichiamo le quantità in dollari per 100 e facciamo tutti gli aritmetici con numeri interi. Il punto di radix viene inserito solo quando si visualizzano i risultati finali (e viene interpretato durante la lettura dei dati dagli esseri umani). Un altro ridimensionamento comune consiste nel rappresentare le intensità dei pixel (da 0 a 1) moltiplicando per 255, in modo che le frazioni da 0 a 1 si adattino a un byte di otto bit.

Esiste anche un software per fornire una precisione estesa (utilizzare diverse unità del tipo aritmetico di base per fornire ulteriore precisione) o precisione arbitraria (utilizzare un numero dinamico di unità per fornire la massima precisione desiderata). Tale software è molto lento rispetto all'aritmetica supportata dall'hardware e viene in genere utilizzato solo per scopi speciali. Inoltre, la precisione estesa ha essenzialmente le stesse proprietà del punto mobile; è solo che gli errori di arrotondamento sono più piccoli, non andati. La precisione arbitraria ha lo stesso difetto, tranne per il fatto che la sua precisione dinamica può consentire di rendere l'errore abbastanza piccolo da consentire di ottenere un risultato finale entro un intervallo necessario (con la prova che lo si è fatto).

Un altro modo per rappresentare i non interi consiste nell'utilizzare le frazioni. È possibile memorizzare un numeratore e un denominatore e eseguire l'aritmetica più o meno allo stesso modo insegnato a scuola: moltiplicare moltiplicando i numeratori e moltiplicando i denominatori. Aggiungi convertendo entrambe le frazioni per avere un denominatore comune, quindi aggiungi i numeratori. Questa sorta di aritmetica è problematica perché i denominatori diventano molto grandi rapidamente, quindi è necessario avere una precisione estesa o una precisione arbitraria per gestirli.

È anche possibile rappresentare numeri in modo simbolico o con espressioni composte. Ad esempio, invece di memorizzare la radice quadrata di due come valore numerico, è possibile memorizzarla con una struttura dati che rappresenta l'operazione di radice quadrata applicata al numero 2. L'esecuzione di qualsiasi operazione, ma le più semplici con tali rappresentazioni, richiede un software molto complicato per gestire le espressioni, combinarle, trovare riduzioni e così via. Questo tipo di rappresentazione viene utilizzato in software matematici specializzati, come Maple e Mathematica.

Infine, puoi rappresentare i numeri come preferisci. I nostri processori moderni sono dispositivi informatici di uso generale, fino ai limiti della loro velocità e capacità di archiviazione, quindi è possibile scrivere algoritmi che rappresentano numeri con stringhe o strutture dati o qualsiasi altra tecnica.

+4

Hey amico, questo è Stack Overflow. L'Encyclopaedia Britannica è il prossimo edificio lungo;) –

+3

Mi dispiace che tu abbia ottenuto 2e-2 voti per byte per quel commento, e ho ottenuto solo 4.3e-4 per la risposta. –

+0

@EricPostpischil puoi spiegare I valori 0 e 255 dei bit di esponente sono speciali. Per altri valori dei bit di esponente, sottraiamo 127 per ottenere esponenti che vanno da -126 (sposta il punto di radix 126 bit a sinistra) a 127 (sposta il punto di radiazione di 127 bit a destra). Non hai detto che MSB è il bit del segno. Cosa significa un esponente negativo? – Geek

3

È un argomento estremamente complesso e può richiedere hardware specializzato in base alle dimensioni della precisione.

La risposta molto semplice è che è po 'variabile ax - contempla 3 modi -

Per esempio a 32 bit FP sarebbe:

1 bit for the sign (-/+) 

8 bits for the exponent (power) of 10 

23 bits for the significant numbers. 

Pensate Excel quando si mette un enorme FP in una cella e fa qualcosa come 1.23E-01 - ciò significa che è 1,23 moltiplicato per 10 alla potenza -1 - in altri termini 0,123.

Quindi, in questo binario sarebbe: 01000000011110110000000000000000

Ripartiti:

0 = sign bit - positive 

010000000 - exponent - one (edit: first bit is sign bit of exponent) 

11110110000000000000000 - signifant figures of 123 

In ogni caso questo è davvero grezzi e il mio binario è arrugginito in modo che qualcuno si prega di correggere gli errori.

+0

+1 per avermi dato l'intuizione. Questo è esattamente quello che volevo, non certo un link wikipedia quasi illeggibile in IEEE in virgola mobile. – Geek

+0

no prob - mi dispiace per il collegamento;) – Dan