tutorial - Asegurando que los dobles de C++ sean de 64 bits
tipos de datos en c++ (7)
En C99, solo puede verificar si el símbolo del preprocesador __STDC_IEC_559__
está definido. Si es así, se le garantiza que un double
será un valor de 8 bytes representado con el formato IEEE 754 (también conocido como IEC 60559). Consulte el estándar C99, Anexo F. No estoy seguro si este símbolo está disponible en C ++, sin embargo.
#ifndef __STDC_IEC_559__
#error "Requires IEEE 754 floating point!"
#endif
Alternativamente, puede verificar las constantes predefinidas __DBL_DIG__
(debe ser 15), __DBL_MANT_DIG__
(debería ser 53), __DBL_MAX_10_EXP__
(debe ser un teléfono), el / la / la / la / la / la / la / la / la / la / la / la / la / la __DBL_MIN_EXP__
. 1021). Estos deben estar disponibles en todos los sabores de C y C ++.
En mi programa C ++, necesito extraer un flotador de 64 bits de una secuencia de bytes externa. ¿Hay alguna manera de asegurar, en tiempo de compilación, que los dobles sean de 64 bits? ¿Hay algún otro tipo que deba usar para almacenar los datos?
Edición: Si está leyendo esto y en realidad está buscando una manera de garantizar el almacenamiento en el formato IEEE 754, eche un vistazo a la respuesta de Adam Rosenfield a continuación.
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 se verá como
char a[0];
que es un error de tiempo de compilación. Solo ponga el comentario apropiado cerca de esta instrucción.
No creo que debas centrarte en el "tamaño original" de tu doble (que generalmente es de 80 bits, no de 64 bits), sino en su precisión.
Gracias a numeric_limits :: digit10 esto es bastante fácil.
Puedes usar las aserciones estáticas Boost para hacer esto. Mira el ejemplo de uso en el ámbito de espacio de nombres .
Una mejora en las otras respuestas (que suponen que un carácter 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 definido en <limits.h>
o <climits>
.
Vea esta publicación para un problema similar y una aserción de tiempo de compilación sin impulso llamado CCASSERT.
Verifique std::numeric_limits< double >::is_iec559
si necesita saber si su implementación de C ++ admite dobles estándar. Esto garantiza no solo que el número total de bits sea de 64, sino también el tamaño y la posición de todos los campos dentro del doble.