Pregunta

En mi programa en C ++, tengo que tirar de un flotador 64 bits a partir de una secuencia de bytes externo. ¿Hay alguna manera de asegurar, en tiempo de compilación, que son dobles 64 bits? ¿Hay algún otro tipo que debe utilizar para almacenar los datos en lugar?

Editar:. Si estás leyendo esto y realmente en busca de una manera de asegurar un almacenamiento en el formato IEEE 754, echar un vistazo a la respuesta de Adam Rosenfield continuación

¿Fue útil?

Solución

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

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

o

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

Puede encontrar CHAR_BIT definido en <limits.h> o <climits>.

Otros consejos

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

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

Alternativamente, se puede comprobar el constantes __DBL_DIG__ predefinido (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 deben estar disponibles en todas las versiones de C y C ++.

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

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

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

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

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

Si el doble no es de 64 bits de entonces la voluntad código es el siguiente

char a[0];

que es un error de tiempo de compilación. Sólo hay que poner el comentario más adecuado cerca de esta instrucción.

este post para un problema similar y una compilación no impulso tiempo de llamada afirmación CCASSERT.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top