Qual è la differenza tra un'operazione in virgola mobile a precisione singola e doppia precisione?


169

Qual è la differenza tra un'operazione a virgola mobile a precisione singola e un'operazione a virgola mobile a precisione doppia?

Sono particolarmente interessato in termini pratici in relazione alle console per videogiochi. Ad esempio, il Nintendo 64 ha un processore a 64 bit e se così fosse, ciò significherebbe che era in grado di eseguire operazioni in virgola mobile a precisione doppia? PS3 e Xbox 360 possono eseguire operazioni in virgola mobile a doppia precisione o solo una precisione singola e in generale vengono utilizzate le capacità di doppia precisione (se esistenti?).


17
Il fatto che la CPU sia a 64 bit di solito significa che la CPU ha registri di uso generale a 64 bit (cioè numeri interi) e dimensioni dell'indirizzo di memoria . Ma non dice nulla sulla matematica in virgola mobile. Ad esempio, le CPU Intel IA-32 sono a 32 bit, ma supportano nativamente float a doppia precisione.
Roman Zavalov,

Risposte:


215

Nota: il Nintendo 64 ha un processore a 64 bit, tuttavia:

Molti giochi hanno sfruttato la modalità di elaborazione a 32 bit del chip poiché la maggiore precisione dei dati disponibile con tipi di dati a 64 bit non è in genere richiesta dai giochi 3D, così come il fatto che l'elaborazione di dati a 64 bit utilizza il doppio della RAM, cache e larghezza di banda, riducendo così le prestazioni complessive del sistema.

Da Webopedia :

Il termine doppia precisione è qualcosa di un termine improprio perché la precisione non è davvero doppia.
La parola double deriva dal fatto che un numero a doppia precisione utilizza il doppio dei bit rispetto a un normale numero a virgola mobile.
Ad esempio, se un numero a precisione singola richiede 32 bit, la sua controparte a precisione doppia sarà lunga 64 bit.

I bit extra aumentano non solo la precisione ma anche la gamma di magnitudini che possono essere rappresentate.
La quantità esatta con cui vengono aumentati la precisione e la gamma di magnitudini dipende dal formato utilizzato dal programma per rappresentare i valori in virgola mobile.
La maggior parte dei computer utilizza un formato standard noto come formato a virgola mobile IEEE.

Il formato IEEE a doppia precisione ha in realtà più del doppio della precisione rispetto al formato a precisione singola, nonché una gamma molto più ampia.

Dallo standard IEEE per l'aritmetica in virgola mobile

Precisione singola

La rappresentazione standard IEEE in virgola mobile a precisione singola richiede una parola a 32 bit, che può essere rappresentata come numerata da 0 a 31, da sinistra a destra.

  • Il primo bit è il bit di segno , S,
  • i successivi otto bit sono i bit esponente , 'E' e
  • gli ultimi 23 bit sono la frazione 'F':

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

Il valore V rappresentato dalla parola può essere determinato come segue:

  • Se E = 255 e F è diverso da zero, allora V = NaN ("Non un numero")
  • Se E = 255 e F è zero e S è 1, allora V = -Infinito
  • Se E = 255 e F è zero e S è 0, allora V = Infinito
  • Se 0<E<255quindi V=(-1)**S * 2 ** (E-127) * (1.F)dove "1.F" è destinato a rappresentare il numero binario creato prefissando F con un inizio implicito 1 e un punto binario.
  • Se E = 0 e F è diverso da zero, allora V=(-1)**S * 2 ** (-126) * (0.F). Questi sono valori "non normalizzati".
  • Se E = 0 e F è zero e S è 1, allora V = -0
  • Se E = 0 e F è zero e S è 0, allora V = 0

In particolare,

0 00000000 00000000000000000000000 = 0
1 00000000 00000000000000000000000 = -0

0 11111111 00000000000000000000000 = Infinity
1 11111111 00000000000000000000000 = -Infinity

0 11111111 00000100000000000000000 = NaN
1 11111111 00100010001001010101010 = NaN

0 10000000 00000000000000000000000 = +1 * 2**(128-127) * 1.0 = 2
0 10000001 10100000000000000000000 = +1 * 2**(129-127) * 1.101 = 6.5
1 10000001 10100000000000000000000 = -1 * 2**(129-127) * 1.101 = -6.5

0 00000001 00000000000000000000000 = +1 * 2**(1-127) * 1.0 = 2**(-126)
0 00000000 10000000000000000000000 = +1 * 2**(-126) * 0.1 = 2**(-127) 
0 00000000 00000000000000000000001 = +1 * 2**(-126) * 
                                     0.00000000000000000000001 = 
                                     2**(-149)  (Smallest positive value)

Doppia precisione

La rappresentazione standard in virgola mobile a precisione doppia IEEE richiede una parola a 64 bit, che può essere rappresentata come numerata da 0 a 63, da sinistra a destra.

  • Il primo bit è il bit di segno , S,
  • i successivi undici bit sono i bit esponente , 'E' e
  • gli ultimi 52 bit sono la frazione 'F':

    S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    0 1        11 12                                                63
    

Il valore V rappresentato dalla parola può essere determinato come segue:

  • Se E = 2047 e F è diverso da zero, allora V = NaN ("Non un numero")
  • Se E = 2047 e F è zero e S è 1, allora V = -Infinito
  • Se E = 2047 e F è zero e S è 0, allora V = Infinito
  • Se 0<E<2047quindi V=(-1)**S * 2 ** (E-1023) * (1.F)dove "1.F" è destinato a rappresentare il numero binario creato prefissando F con un inizio implicito 1 e un punto binario.
  • Se E = 0 e F è diverso da zero, V=(-1)**S * 2 ** (-1022) * (0.F)questi sono valori "non normalizzati".
  • Se E = 0 e F è zero e S è 1, allora V = -0
  • Se E = 0 e F è zero e S è 0, allora V = 0

Riferimento:
standard ANSI / IEEE 754-1985,
standard per l'aritmetica binaria a virgola mobile.


9
Lo so dalla tua fonte, ma non mi piace la frase: "Il termine doppia precisione è un termine improprio perché la precisione non è davvero doppia". La precisione singola e doppia in questi giorni è definita in modo abbastanza universale da IEEE, e come fai notare la precisione singola ha 23 bit nella frazione e il doppio ha 52 bit - che è sostanzialmente il doppio della precisione ...
Carl Walsh

5
@ZeroDivide ' **' è Exponentiation
VonC,

11
@CarlWalsh 52/23! = 2 ergo non è "raddoppia la precisione"
rfoo,

@johnson Hai più dettagli su valori non normalizzate in easy68k.com/paulrsm/6502/WOZFPPAK.TXT , e anche in stackoverflow.com/a/28801033/6309
VonC

2
@rfoo Se vuoi essere sicuro di essere pedante, non è esattamente doppio, ma 52/2> 23 quindi sì, è il doppio della precisione, è solo il doppio e poi un po 'di più.
JShorthouse,

42

Ho letto molte risposte ma nessuna sembra spiegare correttamente la provenienza della parola double . Ricordo un'ottima spiegazione data da un professore universitario che avevo qualche anno fa.

Richiamando lo stile della risposta di VonC, una rappresentazione in virgola mobile a precisione singola utilizza una parola di 32 bit.

  • 1 bit per il segno , S
  • 8 bit per l' esponente , 'E'
  • 24 bit per la frazione , detta anche mantissa , o coefficiente (anche se sono rappresentati solo 23). Chiamiamolo 'M' (per mantissa , preferisco questo nome perché "frazione" può essere frainteso).

Rappresentazione:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(Solo per sottolineare, il bit del segno è l'ultimo, non il primo.)

Una rappresentazione in virgola mobile a precisione doppia utilizza una parola di 64 bit.

  • 1 bit per il segno , S
  • 11 bit per l' esponente , 'E'
  • 53 bit per la frazione / mantissa / coefficiente (anche se solo 52 sono rappresentati), 'M'

Rappresentazione:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

Come puoi notare, ho scritto che la mantissa ha, in entrambi i tipi, un po 'più di informazioni rispetto alla sua rappresentazione. In effetti, la mantissa è un numero rappresentato senza tutto il suo non significativo 0. Per esempio,

  • 0,000124 diventa 0,124 × 10 −3
  • 237.141 diventa 0.237141 × 10 3

Ciò significa che la mantissa sarà sempre nella forma

0.α 1 α 2 ... α t × β p

dove β è la base della rappresentazione. Ma poiché la frazione è un numero binario, α 1 sarà sempre uguale a 1, quindi la frazione può essere riscritta come 1.α 2 α 3 ... α t + 1 × 2 p e il 1 iniziale può essere implicitamente assunto, fare spazio per un bit in più (α t + 1 ).

Ora, è ovviamente vero che il doppio di 32 è 64, ma non è da qui che viene la parola.

La precisione indica il numero di cifre decimali corrette , cioè senza alcun tipo di errore di rappresentazione o approssimazione. In altre parole, indica quante cifre decimali si possono usare in sicurezza .

Detto questo, è facile stimare il numero di cifre decimali che possono essere utilizzate in sicurezza:

  • precisione singola : registro 10 (2 24 ), che corrisponde a circa 7 ~ 8 cifre decimali
  • doppia precisione : registro 10 (2 53 ), che è di circa 15 ~ 16 cifre decimali

19

Va bene, la differenza di base nella macchina è che la doppia precisione utilizza il doppio di bit rispetto al singolo. Nella solita implementazione, sono 32 bit per singolo, 64 bit per doppio.

Ma cosa significa ? Se assumiamo lo standard IEEE, un singolo numero di precisione ha circa 23 bit della mantissa e un esponente massimo di circa 38; una doppia precisione ha 52 bit per la mantissa e un esponente massimo di circa 308.

I dettagli sono su Wikipedia , come al solito.


11

Da aggiungere a tutte le meravigliose risposte qui

Prima di tutto float e double sono entrambi usati per la rappresentazione di numeri numeri frazionari. Quindi, la differenza tra i due deriva dal fatto con quanta precisione possono memorizzare i numeri.

Ad esempio: devo memorizzare 123.456789 Uno potrebbe essere in grado di memorizzare solo 123.4567 mentre altri potrebbero essere in grado di memorizzare esattamente 123.456789.

Quindi, in sostanza, vogliamo sapere con quanta precisione è possibile memorizzare il numero ed è ciò che chiamiamo precisione.

Citando @Alessandro qui

La precisione indica il numero di cifre decimali che sono corrette , cioè senza alcun tipo di errore di rappresentazione o approssimazione. In altre parole, indica quante cifre decimali si possono usare in sicurezza .

Float può memorizzare con precisione circa 7-8 cifre nella parte frazionaria mentre Double può memorizzare con precisione circa 15-16 cifre nella parte frazionaria

Quindi, il galleggiante può immagazzinare il doppio della quantità di parte frazionaria. Ecco perché Double viene chiamato double the float


7

Per quanto riguarda la domanda "PS3 e xbxo 360 possono eseguire operazioni in virgola mobile a doppia precisione o solo una precisione singola e nell'uso generale vengono utilizzate le capacità di doppia precisione (se esistono?)".

Credo che entrambe le piattaforme siano incapaci di doppio virgola mobile. Il processore Cell originale aveva solo float a 32 bit, lo stesso con l'hardware ATI su cui si basa l'XBox 360 (R600). The Cell ha ottenuto il doppio supporto in virgola mobile in seguito, ma sono abbastanza sicuro che la PS3 non usi quel chip.


5

Fondamentalmente l' aritmetica in virgola mobile a precisione singola si occupa di numeri in virgola mobile a 32 bit mentre la doppia precisione si occupa di 64 bit.

Il numero di bit in doppia precisione aumenta il valore massimo che può essere memorizzato e aumenta la precisione (ovvero il numero di cifre significative).


5

Tutti hanno spiegato in dettaglio e niente che potrei aggiungere ulteriormente. Anche se vorrei spiegarlo in termini di Layman o semplicemente INGLESE

1.9 is less precise than 1.99
1.99 is less precise than 1.999
1.999 is less precise than 1.9999

.....

Una variabile, in grado di memorizzare o rappresentare "1.9" fornisce meno precisione di quella in grado di contenere o rappresentare 1.9999. Questa frazione può ammontare a un'enorme differenza nei calcoli di grandi dimensioni.


2

La doppia precisione indica che i numeri richiedono il doppio della lunghezza della parola per la memorizzazione. Su un processore a 32 bit, le parole sono tutte a 32 bit, quindi i doppi sono 64 bit. Ciò significa in termini di prestazioni che le operazioni su numeri a doppia precisione richiedono un po 'più di tempo per essere eseguite. Quindi ottieni una gamma migliore, ma c'è un piccolo successo nelle prestazioni. Questo successo è mitigato un po 'dalle unità hardware a virgola mobile, ma è ancora lì.

L'N64 utilizzava un NEC VR4300 basato su MIPS R4300i che è un processore a 64 bit, ma il processore comunica con il resto del sistema su un bus largo a 32 bit. Quindi, la maggior parte degli sviluppatori ha usato numeri a 32 bit perché sono più veloci e la maggior parte dei giochi all'epoca non aveva bisogno di ulteriore precisione (quindi hanno usato float non doppi).

Tutti e tre i sistemi possono eseguire operazioni flottanti a precisione singola e doppia, ma potrebbero non essere a causa delle prestazioni. (anche se praticamente tutto dopo l'N64 utilizzava un bus a 32 bit quindi ...)


1

Prima di tutto float e double sono entrambi usati per la rappresentazione di numeri numeri frazionari. Quindi, la differenza tra i due deriva dal fatto con quanta precisione possono memorizzare i numeri.

Ad esempio: devo memorizzare 123.456789 Uno potrebbe essere in grado di memorizzare solo 123.4567, mentre altri potrebbero essere in grado di memorizzare esattamente 123.456789.

Quindi, in sostanza, vogliamo sapere con quanta precisione è possibile memorizzare il numero ed è ciò che chiamiamo precisione.

Citando @Alessandro qui

La precisione indica il numero di cifre decimali che sono corrette, cioè senza alcun tipo di errore di rappresentazione o approssimazione. In altre parole, indica quante cifre decimali si possono usare in sicurezza.

Float può memorizzare con precisione circa 7-8 cifre nella parte frazionaria mentre Double può memorizzare con precisione circa 15-16 cifre nella parte frazionaria

Quindi, double può immagazzinare il doppio della quantità di parte frazionaria rispetto al float. Ecco perché Double viene chiamato double the float


0

Secondo IEEE754 • Standard per la memorizzazione in virgola mobile • Standard a 32 e 64 bit (precisione singola e doppia precisione) • Esponente a 8 e 11 bit rispettivamente • Formati estesi (sia mantissa che esponente) per risultati intermedi


-3

Il singolo numero di precisione utilizza 32 bit, con MSB come bit di segno, mentre il doppio numero di precisione utilizza 64 bit, mentre MSB è bit di segno

Precisione singola

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Doppia precisione:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

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.