Domanda

galleggiante tipo punto rappresenta un numero memorizzando sue cifre significative e il suo esponente separatamente parole binarie separati in modo che si adatti 16, 32, 64 o 128 bit.

virgola fissa tipo memorizza numeri con 2 parole, uno che rappresentano la parte intera, un'altra rappresentante la parte passata alla radice, in esponenti negativi, 2 ^ -1, 2 ^ -2, 2 ^ -3, ecc.

Float sono meglio perché hanno una più ampia gamma in senso esponente, ma non se si vuole memorizzare il numero con più precisione per un certo intervallo, ad esempio utilizzando solo intero da -16 a 16, utilizzando quindi più bit di cifre hold passato la radice.

In termini di prestazioni, che uno ha le migliori prestazioni, o ci sono casi in cui un po 'è più veloce rispetto agli altri?

Nel video di programmazione del gioco, fa uso di tutti virgola mobile perché la FPU rende più veloce, o perché il calo di prestazioni è solo trascurabili, o se invece fanno proprio tipo fisso?

Perché non c'è alcun tipo fisso in C / C ++?

È stato utile?

Soluzione

Questa definizione comprende un sottoinsieme molto limitato di implementazioni punto fisso.

Sarebbe più corretto dire che nel punto fisso solo la mantissa viene memorizzato e l'esponente è una costante determinata a priori. Non v'è alcun obbligo per il punto binario a cadere all'interno della mantissa, e sicuramente nessun requisito che cadere su un confine di parola. Ad esempio, tutti i seguenti sono "punto fisso":

  • 64 bit mantissa, scalato per 2 -32 (questo si inserisce la definizione di cui alla domanda)
  • 64 bit mantissa, scalato per 2 -33 (adesso i numeri interi e frazionari non possono essere separate da un confine ottetto)
  • 32 bit mantissa, scalato per 2 4 (Non v'è alcuna parte frazionaria)
  • 32 bit mantissa, scalato per 2 -40 (Non v'è alcuna parte intera)

GPU tendono ad utilizzare punto fisso senza parte intera (tipicamente 32 bit mantissa scalato di 2 -32 ). Pertanto API come OpenGL e Direct3D spesso usano tipi a virgola mobile che sono in grado di contenere questi valori. Tuttavia, manipolando la mantissa intero è spesso più efficiente così queste API consentono specificando coordinate (in spazio struttura, lo spazio colore, ecc) in questo modo pure.

Per quanto riguarda la tua affermazione che C ++ non ha un tipo di punto fisso, sono d'accordo. Tutti i tipi interi in C ++ sono fissi tipi di punto. L'esponente viene spesso ritenuto pari a zero, ma questo non è necessario e ho un po 'di tempo determinato punto codice DSP implementata in C ++ questo modo.

Altri suggerimenti

A livello di codice, aritmetica a virgola fissa è semplicemente aritmetica intera con un denominatore implicita.

Per molte operazioni aritmetiche semplici, a virgola fissa e operazioni intere sono essenzialmente le stesse. Tuttavia, vi sono alcune operazioni che i valori intermedi devono essere rappresentati con un numero maggiore di bit e quindi arrotondato. Ad esempio, per moltiplicare due numeri a virgola fissa a 16 bit, il risultato deve essere memorizzato temporaneamente nel 32 bit prima renormalizing (o saturazione) ritorna a virgola fissa a 16 bit.

Quando il software non approfittare di vettorizzazione (ad esempio a base di CPU SIMD o GPGPU), intero e virgola fissa arithmeric è più veloce FPU. Quando si utilizza vettorizzazione, l'efficienza di vettorizzazione conta molto di più, in modo che le differenze di prestazioni tra virgola fissa e virgola mobile è discutibile.

Alcune architetture forniscono implementazioni hardware per determinate funzioni matematiche, come sin, cos, atan, sqrt, solo per il tipo a virgola mobile. Alcune architetture non forniscono alcuna implementazione hardware a tutti. In entrambi i casi, librerie software di matematica specializzati possono fornire quelle funzioni utilizzando solo numeri interi o aritmetica a virgola fissa. Spesso, queste librerie forniranno più livelli di precisioni, per esempio, le risposte che sono solo fino preciso per N-bit di precisione, che è inferiore alla massima precisione della rappresentazione. Le versioni limitata precisione possono essere più veloce rispetto alla versione più alta precisione.

punto fisso è ampiamente usato in DSP ed embedded-sistemi in cui spesso il processore target senza FPU, e punto fisso può essere implementato ragionevolmente efficiente utilizzando un numero intero ALU.

In termini di prestazioni, che è likley variare a seconda dell'architettura bersaglio e l'applicazione. Ovviamente se non v'è alcun FPU, punto fisso allora sarà notevolmente più veloce. Quando si dispone di una FPU dipenderà l'applicazione troppo. Per esempio l'esecuzione di alcune funzioni come sqrt () o log () sarà molto più veloce quando supportato direttamente nel set di istruzioni piuttosto thna implementato algoritmicamente.

Non c'è tipo built-in punto fisso in C o C ++ immagino perché (o almeno C) sono stati previsti come linguaggi di livello dei sistemi e il punto di necessità fisso è un po 'specifico del dominio, e forse anche perché su un uso generale processore c'è tipicamente supporto hardware non diretta per punto fisso.

In C ++ definire un punto fisso tipo di dati classe con opportuni sovraccarichi operatore e funzioni matematiche associate può facilmente superare questo shortcomming. Tuttavia ci sono soluzioni buone e cattive a questo problema. A bene esempio può essere trovato qui: http://www.drdobbs.com / cpp / 207000448 . Il link per il codice in tale articolo è rotto, ma ho rintracciato giù a ftp: / /66.77.27.238/sourcecode/ddj/2008/0804.zip

Il diferrence tra virgola mobile e numeri in virgola fissa dipende dalla CPU che avete in mente. Sul chip Intel la differenza non è grande in clockticks. matematica Int è ancora più veloce, perché ci sono un multiplo intero ALU è che il lavoro può in parallelo. I compilatori sono anche intelligente per utilizzare speciali istruzioni di calcolo indirizzo per ottimizzare add / moltiplicano in una singola istruzione. conta conversione come un'operazione troppo, quindi basta scegliere il tipo e bastone con esso.

In C ++ è possibile costruire il proprio tipo per la matematica punto fisso. Basta definire come struct con un int e sovrascrivere i sovraccarichi appropriate, e fargli fare quello che fanno normalmente, più un turno per mettere la schiena virgola per la giusta posizione.

È necessario fare attenzione quando si parla di "precisione" in questo contesto.

Per lo stesso numero di bit nella rappresentazione del valore massimo fissato punto ha più bit significativi rispetto a qualsiasi valore decimale (perché il formato in virgola mobile deve dare alcuni bit distanza all'esponente), ma il valore minimo fissato punto ha meno di qualsiasi valore a virgola mobile non denormalizzato (perché il valore rifiuti punto fisso maggior parte della sua mantissa a zeri).

Inoltre secondo il modo in cui si divide il numero punto fisso, il valore in virgola mobile può essere in grado di rappresentare minore numeri nel senso che ha una rappresentazione più precisa di "minuscola ma non zero" .

E così via.

non utilizzate galleggiante nei giochi perché è più veloce o più lento si usa perché è più facile da implementare gli algoritmi in virgola mobile rispetto al punto fisso. Si stanno assumendo la ragione ha a che fare con il calcolo della velocità e che non è la ragione, ha a che fare con la facilità di programmazione.

Per esempio si può definire la larghezza dello schermo / finestra come andare da 0,0 a 1,0, l'altezza dello schermo 0.0 a 1.0. La profondità della parola 0.0 a 1.0. e così via. Matrix matematica, ecc rende le cose reali facile da implementare. Fare tutto la matematica in questo modo fino al punto in cui è necessario calcolare pixel reali su uno schermo di dimensioni reali, dire 800x400. Progetto il raggio dall'occhio al punto sull'oggetto in tutto il mondo e di calcolo dove si perfora lo schermo, utilizzando 0-1 matematica, poi moltiplicare x da 800, 400 y volte e posto tale pixel.

virgola mobile non memorizza l'esponente e mantissa separatamente e la mantissa è un numero goofy, ciò che rimane dopo l'esponente e segno, come 23 bit, non 16 o 32 o 64 bit.

matematica in virgola mobile a suoi usi nucleo fisso logica punti con la logica extra e passaggi aggiuntivi richiesti. Con mele definizione rispetto alle mele punto fisso matematica è più conveniente perché non dovete manipolare i dati sul modo in alluminio e non hanno per manipolare i dati sulla via d'uscita (normalizzazione). Quando si aggiunge in IEEE e tutta la sua spazzatura che aggiunge ancora più logica, più cicli di clock, ecc (debitamente firmato l'infinito, silenzioso e nans segnalazione, risultati diversi per stessa operazione se v'è un gestore di eccezioni abilitato). Come qualcuno ha sottolineato in un commento in un sistema reale dove si può fare fisso e galleggiante in parallelo, è possibile usufruire di alcuni o tutti i processori e recuperare alcuni orologi in quel modo. entrambi con galleggiante e frequenza di clock fisso può essere aumentata utilizzando grandi quantità di chip di immobili, fisso rimarrà più conveniente, ma galleggiante può avvicinarsi a velocità fisse utilizzando questi tipi di trucchi, così come il funzionamento in parallelo.

Un problema non coperta è le risposte è un consumo di energia. Anche se dipende molto specifica architettura hardware, di solito FPU consuma molta più energia di quanto ALU nella CPU in tal modo, se si colpiscono le applicazioni mobili in cui il consumo di energia è importante che vale la pena prendere in considerazione impelementation punto fisso dell'algoritmo.

Dipende da quello che si sta lavorando. Se stai usando punto fisso poi si perde di precisione; è necessario selezionare il numero di cifre dopo il punto decimale (che non può essere sempre abbastanza buono). In virgola mobile non è necessario preoccuparsi di questo come la precisione offerta è quasi sempre abbastanza buono per il compito in mano - utilizza un'implementazione forma standard per rappresentare il numero

.

I pro ei contro scendono a velocità e risorse. Sulle piattaforme a 32bit e 64bit moderne non c'è davvero alcun bisogno di usare punto fisso. Molti sistemi sono dotati costruito in FPUs che sono hardwired ad essere ottimizzati per operazioni a virgola fissa. Inoltre, la maggior parte delle intrinseche CPU moderne e dispongono di operazioni quali il set SIMD che vettore metodi basati via vettorizzazione e srotolando ottimizzare aiuto. Quindi punto fisso viene solo con un lato verso il basso.

Sui sistemi embedded e piccoli microcontrollori (8bit e 16bit) potrebbe non avere una FPU né set di istruzioni estese. Nel qual caso può essere costretti a utilizzare metodi di punto fisso o serie di istruzioni in virgola mobile limitati che non sono molto veloci. Quindi, in queste circostanze punto fisso sarà meglio - o anche la tua unica -. Scelta

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