2009-04-15 18 views
15

En mi programa C++, necesito extraer un flotador de 64 bits de una secuencia de bytes externa. ¿Hay alguna forma de garantizar, en tiempo de compilación, que los dobles sean 64 bits? ¿Hay algún otro tipo que deba usar para almacenar los datos?Asegurando que los dobles de C++ son 64 bits

Editar: Si está leyendo esto y actualmente buscando la manera de garantizar el almacenamiento en el formato IEEE 754, eche un vistazo a la respuesta de Adam Rosenfield a continuación.

+0

¿Qué estás haciendo exactamente? ¿Está buscando una forma completamente portátil de tomar ocho bytes e interpretarlos como un número de coma flotante de 64 bits estándar IEEE? –

+2

@David: Sí, eso es exactamente lo que estoy haciendo. Encontré algo en algún lugar que decía que los flotantes y los dobles de C++ tenían el formato IEEE-754.No estaba seguro de si los dobles siempre usaban la misma precisión y si quería agregar un cheque. – Whatsit

+0

Ahora no estoy seguro de que mi información original era correcta. ¿Cuál es la convención aquí? ¿Debo eliminar esta pregunta y agregar otra pregunta sobre la conversión de IEEE-754? – Whatsit

Respuesta

11

Una mejora en las demás respuestas (que suponen que un char es de 8 bits, el estándar no garantiza esto ...). Sería así:

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

o

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

puede encontrar CHAR_BIT define en <limits.h> o <climits>.

+0

Esto supone incorrectamente que un char es tan grande como un byte. –

+4

um, no, no lo hace en absoluto. sizeof regresa en unidades de caracteres. CHAR_BIT se define como la cantidad de bits por char. multiplique sizeof (x) por CHAR_BIT y tiene * exactamente * cuántos bits es x. –

+0

Entonces, por ejemplo, en x86 CHAR_BIT se define como 8. sizeof (double) return 8. (8 * 8) == 64. –

4

La solución sin impulso es definir la matriz como tal

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

Si el doble no es de 64 bits, entonces el código voluntad parece

char a[0]; 

que es un error de tiempo de compilación. Simplemente ponga el comentario apropiado cerca de esta instrucción.

+0

no se garantiza que un byte sea de 8 bits –

+0

@Evan: punto interesante. Agregue "&& (char sin signo) 255 == 255 && (char sin signo) 256 == 0" a la condición para verificar que los caracteres son 8 bits. –

+1

¿Qué pasa con el caso cuando el tamaño del doble es de 16 bytes, pero el byte consta de 4 bits? –

6

No creo que deba centrarse en el "tamaño bruto" de su doble (que generalmente es de 80 bits, no en 64 bits), sino más bien en su precisión.

Gracias a numeric_limits :: digits10 esto es bastante fácil.

+1

Dobles de 80 bits son un Intel-ismo, y verdadero solo si la FPU está realmente en modo de 80 bits (también hay modo de 64 bits) ... – DevSolar

+0

Lo sé, pero sin embargo ... –

+0

E incluso el modo de 32 bits dependiendo de cómo inicialice Direct3D. –

1

Consulte this post para un problema similar y una aserción de tiempo de compilación no aumentada llamada CCASSERT.

22

En C99, puede verificar si el símbolo del preprocesador __STDC_IEC_559__ está definido. Si es así, se le garantiza que un double tendrá un valor de 8 bytes representado con el formato IEEE 754 (también conocido como IEC 60559). Ver el estándar C99, Anexo F. No estoy seguro si este símbolo está disponible en C++.

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

Alternativamente, se puede comprobar las constantes predefinidas __DBL_DIG__ (debería ser 15), __DBL_MANT_DIG__ (debería ser 53), __DBL_MAX_10_EXP__ (debe ser 308), __DBL_MAX_EXP__ (debería ser 1024), __DBL_MIN_10_EXP (debe ser -307) y __DBL_MIN_EXP__ (debe ser -1021). Estos deberían estar disponibles en todos los sabores de C y C++.

+0

Esta es una solución aún mejor de lo que esperaba. Acepta la respuesta de Evan, sin embargo, ya que responde la pregunta tal como existe. Acabo de hacer la pregunta incorrecta. – Whatsit

6

Compruebe std::numeric_limits<double>::is_iec559 si necesita saber si su implementación en C++ admite dobles estándar. Esto garantiza no solo que el número total de bits es 64, sino también el tamaño y la posición de todos los campos dentro del doble.

Cuestiones relacionadas