2010-01-14 25 views
5

perché abbiamo bisogno di interi e flottante nel processore? Graziefloating e interi ....?

+2

Gli odori come i compiti. –

+1

In realtà penso che questa sia una buona domanda. Quando sei stato nel business abbastanza a lungo, prendi certe cose per scontate. È una buona idea mettere in discussione le tue ipotesi una volta ogni tanto. –

+1

Ho svettato questa domanda. Potrebbe avere l'odore di compiti a casa, ma sicuramente ha generato una piccola tempesta di discussione e non credo che tutti siano coinvolti in uno studente. So che non lo sono, anche se sto lavorando da casa oggi. –

risposta

0

Sono tutti solo numeri, quindi potreste pensare che non è necessario distinguere. Tuttavia, in molte lingue è possibile ottimizzare quando si utilizza la matematica intera: addizione, sottrazione, moltiplicazione e divisione sono possibili con le istruzioni della CPU. Allo stesso modo ci sono istruzioni che eseguono operazioni simili su numeri in virgola mobile, ma poiché i numeri sono rappresentati in modo diverso nella macchina e le operazioni sono diverse, allora ha senso imbastire la distinzione tra interi e float che è evidente nel processore, in il linguaggio di programmazione stesso.

C#, Java, C++ e altri linguaggi hanno tutti i tipi distinti per la gestione degli interi rispetto ai float. Javascript fa la scelta opposta - non esiste un tipo intero speciale, e se non sbaglio, tutti i numeri sono float.


Per quanto riguarda il motivo per cui avete bisogno di int e galleggianti - galleggianti permettono una gamma molto più ampia di valori, anche se a estremi (ad esempio, quantità astronomiche) la precisione cade. Non è possibile rappresentare 1.37999933247474x10e24 con precisione in matematica a virgola mobile. D'altra parte, gli inte offrono precisione e velocità per un insieme fisso di numeri.

0

I numeri interi sono più facili per le risorse del processore e spesso più veloci. Questo è stato un grosso problema molti anni fa, quando i processori non erano nemmeno dotati di funzionalità floating point integrate. Non tanto adesso, ma le differenze possono ancora essere significative nel codice ristretto.

I numeri interi sono spesso tutto ciò di cui avete bisogno.

0

I valori in virgola mobile hanno un intervallo [molto] maggiore di quello degli interi. Inoltre, possono rappresentare valori frazionari. Queste caratteristiche tuttavia sono fornite a costo di una perdita di precisione.

Edit: (cosa intendo per perdita di precisione)
intero aritmetica è sempre esatto, tanto che non si prevedono operando che causano un overflow, o una divisione per zero.
Questo non è il caso dell'aritmetica in virgola mobile, per cui alcune porzioni di valori possono essere perse quando si utilizzano tali valori in operazioni semplici. La ragione di ciò è che l'enorme intervallo offerto dai valori in virgola mobile è tale che è impossibile rappresentare tutti i valori contigui all'interno dell'intervallo, data la [relativamente] piccola memoria (in genere 8 o 16 byte).

+1

Non sempre. Un doppio a 64 bit ha più precisione di un int a 32 bit. –

+0

@ Mark Ransom. indipendentemente dalle dimensioni variabili, un intero è sempre, _con il suo intervallo_, preciso al 100%. Questo è diverso da un valore float, che nel suo intervallo può includere parti che andranno perse quando il valore viene usato per calcoli vari, anche semplici. – mjv

+0

È banalmente facile generare una costante che rappresenta il più grande valore in virgola mobile che garantisce una precisione uguale a un intero. Il punto di virgola mobile offre spesso garanzie ancora maggiori. Cosa ottieni se moltiplichi 2147483647 x 2147483647 come numeri interi? Come i doppi? –

2

I numeri interi sono per il conteggio, i numeri in virgola mobile sono per il calcolo. Li abbiamo entrambi in matematica (dove sono chiamati rispettivamente numeri interi e numeri reali) quindi ne abbiamo bisogno negli algoritmi e anche nei programmi. Fine della storia.

Certo, la gamma di maggior parte delle implementazioni numero fp è più grande della gamma di maggior parte delle implementazioni interi, ma ho potuto inventare un linguaggio di domani in cui mi permetto interi 512 bit, ma solo numeri in virgola mobile a 16 bit (bit 1 segno 3 bit esponenti, 12 significanti e bit). I numeri interi non sono ancora chiusi in divisione e i numeri in virgola mobile non sono ancora utilizzabili per il conteggio perché mentre c'è una funzione successore su numeri fp non ci sono numeri reali e ci piace fingere che i numeri fp siano un'implementazione ravvicinata di numeri reali.

No, gli interi non sono più facili sul processore, il processore esegue operazioni logiche booleane fondamentali sui bit. E se il processore X1 esegue un aritmetico intero più veloce dell'aritmetica fp, una trappola attraverso i banchi di memoria troverà un esempio di contro.

Non abbiamo nemmeno bisogno di numeri fp per frazioni, potremmo utilizzare coppie di numeri interi per rappresentare numeratore e denominatore.

La precisione assoluta degli interi è il motivo per cui li usiamo per il conteggio. Per tutti gli scopi pratici la precisione delle implementazioni FP esistenti è sufficiente (ora, c'è una richiesta selvaggia di attrarre disaccordo!)

saluti

Mark

+1

I numeri FP NON sono numeri reali. Per favore non dare a OP oa nessuno quell'idea. I numeri FP non sono chiusi sulla divisione, come lei menziona. L'infinito è un numero in virgola mobile ma non è né reale né int. – Potatoswatter

+1

Il punto di galleggiamento è assolutamente chiuso sotto divisione. Quando si dividono due valori in virgola mobile, si ottiene un altro valore in virgola mobile. Sempre. Potrebbe non essere esattamente uguale al risultato che otterresti se fossero numeri reali, ma non è quello che * closed * significa. La divisione dei valori in virgola mobile è * definita * per includere questo arrotondamento. –

+0

Oh, penso che abbiamo un sottile problema terminologico qui. Potatoswatter ha detto "numero FP", e Stephen ha detto "valore in virgola mobile". Che mi dici di NaN? È un valore che può contenere una variabile in virgola mobile, ma per sua stessa ammissione non è un numero. I numeri * in virgola mobile * non sono chiusi in divisione, ma i valori * di variabili in virgola mobile sono chiusi in divisione, giusto? – Ken

0

Interi sono le cose più comuni da utilizzare nelle attività di programmazione. Possono rappresentare gli indirizzi di memoria. È facile contare da un numero intero a un altro: basta aggiungerne uno.

I valori a virgola mobile vengono utilizzati per approssimare i numeri reali. I numeri reali sono il tipo di cosa più comune in matematica continua. La matematica continua viene utilizzata per rappresentare il mondo reale. valori in virgola mobile (qui la terminologia "numero reale.")

non possono di solito essere utilizzati come numeri interi. Non puoi facilmente contare da X al numero successivo maggiore di X. Si arrotondano e non c'è alcuna garanzia che X + 1 sia anche un numero diverso da X. In generale, due numeri a virgola mobile potrebbero essere diversi se sono stati prodotti da diverse sequenze di operazioni, anche se si suppone che le espressioni siano uguali.

I numeri in virgola mobile sono imprevedibili, come nella vita reale. Gli interi sono ordinati ed efficienti, come i computer.

+0

I numeri in virgola mobile sono completamente prevedibili. Non è che il tuo computer restituisca un numero casuale quando lo chiedi agli annunci da 1e-32 a 1e + 32. Semplicemente non è semplice, e certamente non intuitivo per l'utente occasionale. Devi studiare lo standard di implementazione pertinente ed essere disposto a elaborare i dettagli sulla carta, se necessario. –

+0

Anche alcuni aspetti della vita reale sono prevedibili e diventano più prevedibili con più analisi. È un'analogia. – Potatoswatter

0

Nella maggior parte delle applicazioni numeri a virgola mobile possono essere sostituiti da numeri interi, con attenzione definendo quale intervallo di valori deve essere rappresentato in quanto la precisione, e moltiplicando con opportuni fattori di scala. Tuttavia, questo è uno sforzo di sviluppo aggiuntivo, che vale la pena solo su piccole piattaforme embedded (cioè microcontrollori di piccole dimensioni) che non possono eseguire calcoli in aritmetica in virgola mobile nel tempo disponibile.

Con i numeri in virgola mobile si possono ottenere via senza pensare alla rappresentazione dei valori maggior parte del tempo, fino a quando si rimane all'interno della gamma e precisione disponibili. Sfortunatamente questo è piuttosto pericoloso, perché in questo modo potresti non notare quando lasci la regione sicura.

0

Un prospettica leggermente diversa: interi sono utili per quantitativi digitali, mentre galleggianti sono utili per grandezze analogiche. Un esempio, guardando le barche nel porto, usa gli inte per contare le barche, usa i galleggianti per rappresentare il livello dell'acqua.