Quali sono le applicazioni / i vantaggi di un tipo di dati di precisione estesa a 80 bit?

StackOverflow https://stackoverflow.com/questions/612507

  •  03-07-2019
  •  | 
  •  

Domanda

Sì, intendevo dire 80-bit . Non è un refuso ...

La mia esperienza con variabili a virgola mobile ha sempre coinvolto multipli a 4 byte, come singoli (32 bit), doppi (64 bit) e doppi lunghi (che ho visto indicati come 96-bit o 128-bit ). Ecco perché ero un po 'confuso quando mi sono imbattuto in un tipo di dati di precisione estesa a 80 bit mentre stava lavorando su un codice per leggere e scrivere su AIFF (Audio Interchange File Format) file : un esteso la variabile di precisione è stata scelta per memorizzare la frequenza di campionamento della traccia audio.

Quando ho sfogliato Wikipedia, ho trovato il link sopra insieme a una breve menzione dei formati a 80 bit in standard IEEE 754-1985 (ma non nel standard IEEE 754-2008 sommario). Sembra che su alcune architetture "estese" e "lungo doppio" sono sinonimi.

Una cosa che non ho riscontrato sono applicazioni specifiche che fanno uso di tipi di dati di precisione estesa (ad eccezione, ovviamente, delle frequenze di campionamento dei file AIFF). Questo mi ha portato a chiedermi:

  • Qualcuno ha riscontrato una situazione in cui una precisione estesa era necessaria / utile per alcune applicazioni di programmazione?
  • Quali sono i vantaggi di un numero in virgola mobile a 80 bit, oltre all'ovvio "è un po 'più di precisione di un doppio ma meno byte rispetto alla maggior parte delle implementazioni di un doppio doppio"?
  • La sua applicabilità sta calando?
È stato utile?

Soluzione

Le FPU di Intel utilizzano internamente il formato a 80 bit per ottenere una maggiore precisione per risultati intermedi.

Cioè, potresti avere variabili a 32 o 64 bit, ma quando vengono caricate nei registri FPU, vengono convertite in 80 bit; la FPU quindi (di default) esegue tutti i calcoli in 80 ma; dopo il calcolo, il risultato viene archiviato nuovamente in variabili a 32 o 64 bit.

A proposito: una conseguenza alquanto sfavorevole di ciò è che i build di debug e di rilascio possono produrre risultati leggermente diversi: nella build di rilascio, l'ottimizzatore può mantenere una variabile intermedia in un registro FPU a 80 bit, mentre nella build di debug, verrà memorizzato in una variabile a 64 bit, causando una perdita di precisione. Puoi evitarlo utilizzando le variabili a 80 bit o utilizzare uno switch FPU (o un'opzione del compilatore) per eseguire tutti i calcoli a 64 bit.

Altri suggerimenti

Per me l'uso di 80 bit è ESSENZIALE. In questo modo ottengo autovalori di alto ordine (30.000) e autovettori di matrici simmetriche con altre quattro figure quando uso la libreria GOTO per prodotti interni vettoriali, vale a dire 13 invece di 9 cifre significative per il tipo di matrici che utilizzo in atomico relativistico calcoli, necessari per evitare di cadere nel mare di stati di energia negativa. L'altra mia opzione è l'utilizzo dell'aritmetica a precisione quadrupla che aumenta il tempo della CPU 60-70 volte e aumenta anche i requisiti di RAM. Ne trarrà vantaggio qualsiasi calcolo basato su prodotti interni di grandi vettori. Naturalmente, al fine di mantenere risultati parziali del prodotto interno nei registri, è necessario utilizzare il linguaggio assembler, come nelle librerie GOTO. È così che ho imparato ad amare i miei vecchi processori Opteron 850, che userò finché dureranno per quella parte dei miei calcoli.

La ragione per cui 80 bit è veloce, mentre una maggiore precisione è molto più lenta, è che l'hardware a virgola mobile standard della CPU ha registri a 80 bit. Pertanto, se vuoi i 16 bit extra (11 bit extra di mantissa, quattro bit extra di esponente e un altro bit effettivamente inutilizzati), allora non ti costa molto estendere da 64 a 80 bit - mentre estendere oltre 80 bit è estremamente costoso in termini di tempo di esecuzione. Quindi, potresti anche usare la precisione a 80 bit se lo desideri. Non è gratuito da usare, ma è piuttosto economico.

Wikipedia spiega che un formato a 80 bit può rappresentare un intero numero a 64 bit senza perdere informazione. Pertanto, l'unità a virgola mobile della CPU può essere utilizzata per implementare la moltiplicazione e la divisione per numeri interi.

Un altro vantaggio non ancora menzionato per i tipi a 80 bit è quello sui processori a 16 o 32 bit che non hanno unità a virgola mobile ma hanno un "moltiplicare" l'istruzione che produce un risultato due volte più lungo degli operandi (16x16- > 32 o 32x32- > 64), l'aritmetica su una mantissa a 64 bit suddivisa in quattro o due registri a 16-bit o 32-bit sarà più veloce dell'aritmetica su una mantissa a 53 bit che si estende sullo stesso numero di registri ma deve condividere 12 bit di registro con il segno e l'esponente. Per applicazioni che non richiedono nulla di più preciso di float , i calcoli su un float esteso "a 48 bit" allo stesso modo il tipo potrebbe essere più veloce dei calcoli su un float a 32 bit.

Mentre alcune persone potrebbero lamentarsi del comportamento di duplice arrotondamento dei tipi a precisione estesa, ciò sta realisticamente parlando solo di un problema in applicazioni specializzate che richiedono la riproducibilità multipiattaforma a bit-esatta. Da un punto di vista accuratezza , la differenza tra un errore di arrotondamento di 64/128 contro 65/128 o 1024 / 2048ulp contro 1025/2048 non è un problema; in lingue con tipi di variabili a precisione estesa e semantica a precisione estesa coerente , l'uso di tipi estesi su molte piattaforme senza hardware a virgola mobile (ad esempio sistemi integrati) offrirà entrambi precisione e velocità migliore rispetto ai tipi a virgola mobile a precisione singola o doppia.

Ho usato 80 bit per alcune ricerche matematiche pure. Ho dovuto riassumere i termini in una serie infinita che è diventata abbastanza grande, al di fuori della gamma dei doppi. Convergenza e accuratezza non erano preoccupazioni, ma solo la capacità di gestire grandi esponenti come 1E1000. Forse algebra intelligente avrebbe potuto semplificare le cose, ma era molto più rapido e semplice codificare un algoritmo con precisione estesa, piuttosto che passare del tempo a pensarci.

Ho un amico che ci sta lavorando. Sta lavorando a una libreria per gestire punti flottanti delle dimensioni di gigabyte. Certo, è qualcosa legato al calcolo scientifico (calcoli con plasma), e probabilmente solo questo tipo di calcolo funziona con numeri così grandi ...

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