Punto fisso vs numero in virgola mobile


109

Non riesco a capire i numeri in virgola fissa e in virgola mobile a causa delle definizioni difficili da leggere su di essi in tutto Google. Ma nessuno di quelli che ho letto fornisce una spiegazione abbastanza semplice di cosa siano realmente. Posso ottenere una definizione semplice con l'esempio?


Ho anche problemi a trovare una buona definizione. La cosa principale che cerco è qualcosa che mi aiuti a capire questi risultati: 3.11 + 42.0 = 45.110001 (non 45.11), 3.12 + 42.0 = 45.119999 (non 45.12), 3.15 + 42.0 = 45.150002 (non 45.15).
Bart S.

1
Penso che questa sia una discussione rilevante (in particolare descrivendo le trappole con numeri fluttuanti e la migliore precisione con il punto fisso e perché non vorresti mai descrivere il denaro come un flottante. Stackoverflow.com/questions/6320209/…
Andrew Norman

Collegamento casuale in cui vengono menzionati gli argomenti "OpenGL® ES OpenGL ES include profili per sistemi a virgola mobile e a virgola fissa e la specifica EGL ™ ..."
The Red Pea

Risposte:


145

Un numero a virgola fissa ha un numero specifico di bit (o cifre) riservato alla parte intera (la parte a sinistra del punto decimale) e uno specifico numero di bit riservato alla parte frazionaria (la parte a destra del punto decimale punto). Non importa quanto grande o piccolo sia il tuo numero, utilizzerà sempre lo stesso numero di bit per ogni porzione. Ad esempio, se il formato del punto fisso fosse in decimale, IIIII.FFFFFil numero più grande che potresti rappresentare sarebbe 99999.99999e il numero diverso da zero più piccolo sarebbe 00000.00001. Ogni bit di codice che elabora tali numeri deve avere una conoscenza incorporata di dove si trova il punto decimale.

Un numero in virgola mobile non riserva un numero specifico di bit per la parte intera o la parte frazionaria. Invece riserva un certo numero di bit per il numero (chiamato mantissa o significando ) e un certo numero di bit per dire dove si trova la cifra decimale (chiamata esponente ). Quindi un numero in virgola mobile che ha occupato 10 cifre con 2 cifre riservate all'esponente potrebbe rappresentare un valore più grande di 9.9999999e+50e un valore più piccolo diverso da zero di 0.0000001e-49.


8
Bene, stai dimenticando che i numeri in virgola mobile sono quasi sempre firmati, quindi il valore minimo sarebbe davvero -9.9999999e+50.
Brian Gordon

4
Inoltre è presente la polarizzazione degli esponenti in modo da poter rappresentare valori molto più discreti tra 0 e 1 rispetto a quelli che puoi tra 1.000.000 e 1.000.001. E ci sono molte complicazioni con le operazioni in virgola mobile che si presentano, come assicurarsi di non riportare 0 come differenza tra due numeri molto simili quando il bias non è sufficiente per aumentare la precisione.
Brian Gordon

28
@BrianGordon: non ho dimenticato i bit di segno; Li ho volutamente ignorati per avere una descrizione semplice e non devo preoccuparmi della differenza tra minimo / massimo e più piccolo / grande. Ho anche tralasciato intenzionalmente la distorsione degli esponenti (che non ha nulla a che fare con il numero di valori discreti tra due numeri qualsiasi), NaN, infiniti, normalizzazione, underflow graduale, zero con segno, il fatto che la maggior parte dei float sono binari (che consente il primo bit della mantissa da tralasciare) e una serie di altri aspetti che non sono necessari per illustrare il concetto.
Gabe

2
Perché il limite per il numero minimo di punti fissi 00000.00001? Mi aspetto di vedere 00000.00000invece. Inoltre, hai riferimenti che vanno più in dettaglio sui numeri in virgola fissa?
Nicholas Miller

4
@ NickMiller: scusa per la confusione, ma stavo parlando di numeri diversi da zero. Il mio formato di esempio può rappresentare 0, 0.00001, 0.00002, ..., 99999.99998, 99999.99999.
Gabe

31

Un numero in virgola fissa significa semplicemente che c'è un numero fisso di cifre dopo il punto decimale. Un numero in virgola mobile consente un numero variabile di cifre dopo il punto decimale.

Ad esempio, se hai un modo per memorizzare i numeri che richiedono esattamente quattro cifre dopo il punto decimale, allora è un punto fisso. Senza questa restrizione è in virgola mobile.

Spesso, quando viene utilizzato il punto fisso, il programmatore utilizza effettivamente un numero intero e quindi presuppone che alcune delle cifre siano oltre il punto decimale. Ad esempio, potrei voler mantenere due cifre di precisione, quindi un valore di 100 significa in realtà 1,00, 101 significa 1,01, 12345 significa 123,45, ecc.

I numeri in virgola mobile sono più generici perché possono rappresentare numeri molto piccoli o molto grandi allo stesso modo, ma c'è una piccola penalità nel dover disporre di spazio di archiviazione aggiuntivo per dove va la cifra decimale.


2
l'utilizzo in virgola mobile diventa un problema quando inizi a fare calcoli con loro, ad esempio se aggiungi un numero in virgola mobile molto piccolo e uno molto grande insieme. Il risultato sommato perde precisione poiché deve rappresentare un numero con due estremi e i decimali inferiori vengono tagliati (e non arrotondati).
Andrew Norman

2
anche il potenziale utilizzo di valori esponenziali in virgola mobile può causare problemi con i sistemi informatici che si aspettano numeri standard
Andrew Norman

5

Dalla mia comprensione, l'aritmetica in virgola fissa viene eseguita utilizzando numeri interi. dove la parte decimale è memorizzata in una quantità fissa di bit, o il numero viene moltiplicato per il numero di cifre di precisione decimale necessarie.

Ad esempio, se il numero 12.34deve essere memorizzato e sono necessarie solo due cifre di precisione dopo il punto decimale, il numero viene moltiplicato per 100per ottenere 1234. Quando eseguiamo calcoli su questo numero, usiamo questo set di regole. L'aggiunta di 5620o 56.20a questo numero produrrebbe 6854in dati o 68.54.

Se vogliamo calcolare la parte decimale di un numero a virgola fissa, utilizziamo l'operando modulo (%).

12.34 (pseudocodice):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

I numeri in virgola mobile sono una storia completamente diversa nella programmazione. Lo standard corrente per i numeri in virgola mobile utilizza qualcosa come 23 bit per i dati del numero, 8 bit per l'esponente e 1 ma per il segno. Vedi questo collegamento di Wikipedia per ulteriori informazioni su questo.


3

Il termine "punto fisso" si riferisce al modo corrispondente in cui i numeri sono rappresentati, con un numero fisso di cifre dopo e talvolta prima del punto decimale. Con la rappresentazione in virgola mobile, il posizionamento del punto decimale può "fluttuare" rispetto alle cifre significative del numero. Ad esempio, una rappresentazione in virgola fissa con una convenzione di posizionamento del punto decimale uniforme può rappresentare i numeri 123.45, 1234.56, 12345.67, ecc., Mentre una rappresentazione in virgola mobile potrebbe inoltre rappresentare 1.234567, 123456.7, 0.00001234567, 1234567000000000, ecc.


-6

Prendi il numero 123.456789

  • Come numero intero, questo numero sarebbe 123
  • Come punto fisso (2), questo numero sarebbe 123,46 (supponendo che tu lo abbia arrotondato per eccesso)
  • In virgola mobile, questo numero sarebbe 123,456789

La virgola mobile ti consente di rappresentare quasi tutti i numeri con grande precisione. Fixed è meno preciso, ma più semplice per il computer ..


11
La precisione con cui puoi scrivere un numero non è correlata al fatto che sia scritto in virgola mobile, intero o in virgola fissa. È correlato al numero di cifre significative che hai a disposizione. Ad esempio, INT_MAX è un numero che può essere rappresentato esattamente come un int, ma non come un float perché non hanno i 31 bit di precisione necessari per rappresentarlo esattamente.
Kian

1
fixed è il più preciso purché sia ​​dimensionato per gestire il numero in questione. Quando si eseguono calcoli con numeri in virgola fissa, l'arrotondamento si verifica quando un calcolo ha un resto che supera il limite decimale. Con una virgola mobile puoi ottenere un valore molto impreciso se aggiungi un numero molto piccolo con uno molto grande. Quando ciò si verifica, le cifre vengono perse senza arrotondamento
Andrew Norman,

Questo è fuorviante e sbagliato. Punto fisso significa che il numero di cifre dopo il punto decimale è fisso. Non dice nulla su quanta precisione ha.
Oscar Smith
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.