Domanda

Nel mio programma C ++, ho bisogno di tirare un galleggiante a 64 bit da una sequenza di byte esterna. C'è qualche modo per garantire, al momento della compilazione, che doppie sono 64 bit? C'è qualche altro tipo dovrei usare per memorizzare i dati, invece?

Modifica:. Se stai leggendo questo e effettivamente alla ricerca di un modo per assicurare lo stoccaggio nel formato IEEE 754, hanno uno sguardo a risposta di Adam Rosenfield seguente

È stato utile?

Soluzione

Un miglioramento sulle altre risposte (che assumono un carattere è 8-bit, lo standard non garantisce questo ..). Sarebbe in questo modo:

char a[sizeof(double) * CHAR_BIT == 64];

o

BOOST_STATIC_ASSERT(sizeof(double) * CHAR_BIT == 64);

Si possono trovare CHAR_BIT definito <limits.h> o <climits>.

Altri suggerimenti

In C99, si può solo verificare se il __STDC_IEC_559__ simbolo del preprocessore è definito. Se lo è, allora si ha la garanzia che un double sarà un valore di 8 byte rappresentato con IEEE 754 (noto anche come IEC 60559) formato. Vedere lo standard C99, l'allegato F. Non sono sicuro se questo simbolo è disponibile in C ++, però.

#ifndef __STDC_IEC_559__
#error "Requires IEEE 754 floating point!"
#endif

In alternativa, è possibile controllare il costanti predefinite __DBL_DIG__ (dovrebbe essere 15), __DBL_MANT_DIG__ (dovrebbe essere 53), __DBL_MAX_10_EXP__ (dovrebbe essere 308), __DBL_MAX_EXP__ (dovrebbe essere 1024), __DBL_MIN_10_EXP (dovrebbe essere -307), e __DBL_MIN_EXP__ ( dovrebbe essere -1021). Questi dovrebbero essere disponibili in tutte le versioni di C e C ++.

Controlla std::numeric_limits< double >::is_iec559 se avete bisogno di sapere se l'implementazione C ++ supporta doppie standard. Ciò garantisce non solo che il numero totale di bit è 64, ma anche la dimensione e la posizione di tutti i campi all'interno della doppia.

Non credo che si dovrebbe concentrarsi sul "formato raw" del doppio (che è generalmente di 80 bit, non a 64 bit), ma piuttosto sulla sua precisione.

Grazie a numeric_limits :: digits10 questo è abbastanza facile.

È possibile utilizzare il Boost affermazioni statici a Fai questo. Guardate la rel="noreferrer"> esempio.

La soluzione senza boost è definire la matrice in questo modo

char a[ 8 == sizeof(double) ];

Se il doppio non è a 64 bit, allora il codice volontà appare come

char a[0];

che è un errore di compilazione. Basta mettere il commento appropriato nelle vicinanze di questo insegnamento.

questo post per un problema simile e una compilazione non-boost tempo asserzione chiamato CCASSERT.

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