Domanda

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

Sono particolarmente interessato, in termini pratici, in relazione alle console di videogiochi.Per esempio, il Nintendo 64 hanno un processore a 64 bit, e se è così, allora vorresti dire che essa era in grado di virgola mobile a doppia precisione le operazioni?Può PS3 e Xbox 360 tirare fuori virgola mobile a doppia precisione le operazioni o solo in singola precisione e, in generale, utilizzare la doppia precisione, capacità fatto uso di (se esiste?).

È stato utile?

Soluzione

Nota: 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 i 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 RAM, cache e larghezza di banda, riducendo così le prestazioni complessive del sistema.

Da Webopedia :

  

Il termine doppia precisione è 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 valori in virgola mobile.
  La maggior parte dei computer utilizza un formato standard noto come formato a virgola mobile IEEE.

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 segno bit, S,
  • i successivi otto bit sono i esponente bit, '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 = -Infinity
  • Se E = 255 e F è zero e S è 0, allora V = Infinito
  • Se 0<E<255 allora V=(-1)**S * 2 ** (E-127) * (1.F) dove " 1.F " è inteso a rappresentare il numero binario creato prefissando F con un primo implicito 1 e un punto binario.
  • Se E = 0 e F è diverso da zero, quindi V=(-1)**S * 2 ** (-126) * (0.F). Questi sono " non normalizzati " valori.
  • 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 IEEE in virgola mobile a precisione doppia richiede una parola a 64 bit, che può essere rappresentata come numerata da 0 a 63, da sinistra a destra.

  • Il primo bit è il segno bit, S,
  • i successivi undici bit sono i esponente bit, '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 = -Infinity
  • Se E = 2047 e F è zero e S è 0, allora V = Infinito
  • Se 0<E<2047 allora V=(-1)**S * 2 ** (E-1023) * (1.F) dove " 1.F " è inteso a rappresentare il numero binario creato prefissando F con un primo implicito 1 e un punto binario.
  • Se E = 0 e F è diverso da zero, quindi V=(-1)**S * 2 ** (-1022) * (0.F) Questi sono " non normalizzati " valori.
  • 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:
Norma ANSI / IEEE 754-1985,
Standard per l'aritmetica binaria in virgola mobile.

Altri suggerimenti

Ho letto molte risposte ma nessuna sembra spiegare correttamente da dove provenga la parola doppio . 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 di precisione singola utilizza una parola di 32 bit.

  • 1 bit per il segno , S
  • 8 bit per esponente , 'E'
  • 24 bit per la frazione , chiamata anche mantissa o coefficiente (anche se sono rappresentati solo 23). Chiamiamolo 'M' (per mantissa , preferisco questo nome come & Quot; frazione & Quot; può essere frainteso).

Rappresentanza:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

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

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

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

Rappresentanza:

           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 0 non significativo. Ad esempio,

  • 0,000124 diventa 0,124 & # 215; 10 # 8722 &, 3
  • 237.141 diventa 0.237141 & # 215; 10 3

Ciò significa che la mantissa sarà sempre nella forma

0 # 945. &; 1 # 945 &; 2 ... # 945 &; t & # 215; & # 946; p

dove & # 946; è la base della rappresentazione. Ma poiché la frazione è un numero binario, & # 945; 1 sarà sempre uguale a 1, quindi la frazione può essere riscritta come 1. & # 945; 2 α3...αt+1 & # 215; 2 p e 1 iniziale possono essere assunti implicitamente, facendo spazio per un bit in più (& # 945; 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 che sono corrette , vale a dire senza alcun tipo di errore di rappresentazione o approssimazione. In altre parole, indica quante cifre decimali si può tranquillamente utilizzare.

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

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

Va bene, la differenza di base della macchina è che in doppia precisione utilizza il doppio del numero di bit come singolo.Nel solito attuazione,a 32 bit per il singolo, 64 bit per il doppio.

Ma che cosa media?Se assumiamo che la IEEE standard, quindi un numero a precisione singola è di circa 23 bit di mantissa, e un massimo esponente di circa 38;una doppia precisione ha 52 bit per la mantissa e un massimo esponente di circa 308.

I dettagli sono a Wikipedia, come di consueto.

Per aggiungere a tutte le meravigliose risposte qui

Innanzitutto float e double sono entrambi utilizzati per la rappresentazione di 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 corrette ,   cioè senza alcun tipo di errore di rappresentazione o approssimazione. Nel   in altre parole, indica quante cifre decimali si può tranquillamente utilizzare.

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

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

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

Credo che entrambe le piattaforme non siano in grado di virare in 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). Il cellulare ha ottenuto il doppio supporto in virgola mobile in seguito, ma sono abbastanza sicuro che la PS3 non usi quel frammento.

Fondamentalmente precisione singola l'aritmetica in virgola mobile si occupa di numeri in virgola mobile a 32 bit mentre 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).

Doppia precisione significa 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 mobili 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 ...)

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

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ò memorizzare il doppio della quantità di parte frazionaria rispetto al float. Ecco perché Double è chiamato double the float

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

Precisione singola

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Doppia precisione:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top