que - ¿Cuál es el tamaño de flotación y el doble en C y C++?
long long c++ range (7)
Como las CPUs implementan operaciones de punto flotante en un nivel bajo, el estándar de C ++ no exige un tamaño para un float
, double
o long double
. Todo lo que dice es que el orden que los especifiqué está en orden de precisión igual o mayor.
Su mejor static_assert
es usar static_assert
, sizeof
, typedef
y #define
cuidadosamente para definir tipos de punto flotante multiplataforma.
Esta pregunta ya tiene una respuesta aquí:
- Tipos de punto flotante de tamaño fijo 4 respuestas
Estaba buscando para ver si hay algún tipo estándar similar a uint32_t
que siempre se uint32_t
en un tipo integral sin signo de 32 bits pero no pude encontrar ninguno.
¿El tamaño del float
siempre de 4 bytes en toda la plataforma?
¿El tamaño del double
siempre es 8?
¿Alguno de los estándares dice algo al respecto?
Quiero asegurarme de que mi tamaño sea siempre el mismo en todas las plataformas (x86 y x64), así que estoy usando tipos int estándar, pero no pude encontrar ningún typedef similar para float
y double
.
El estándar C ++ no dice nada, pero en la mayoría de las plataformas, C ++ usa el estándar de precisión simple / doble de IEEE, que define la precisión simple como 4 bytes y la precisión doble como 8 bytes.
http://en.wikipedia.org/wiki/Single-precision_floating-point_format http://en.wikipedia.org/wiki/Double-precision_floating-point_format
No estoy seguro de las excepciones para estos casos.
En el caso de X86, incluso si se usan números de precisión simples y dobles IEEE, los cálculos internos se ven afectados por una palabra de control de coma flotante (FCW). Los cálculos internos son normalmente de 64 bit u 80 bit (long double). Puede anular esto usando el código ensamblador en línea, pero no hay garantía de que alguna función de biblioteca de precisión doble no lo restablezca.
Microsoft admitía dobles largos de 80 bits con sus compiladores de 16 bits, pero dejó de admitirlos con sus compiladores de 32 bits y 64 bits, y los dobles largos ahora son los mismos que los dobles de 64 bits.
No dice nada sobre el tamaño.
3.9.1.8
Hay tres tipos de punto flotante: flotante, doble y largo doble. El tipo double proporciona al menos tanta precisión como float, y el tipo double double proporciona al menos tanta precisión como el doble. El conjunto de valores del tipo float es un subconjunto del conjunto de valores del tipo double; el conjunto de valores del tipo double es un subconjunto del conjunto de valores del tipo double double. La representación del valor de los tipos de coma flotante está definida por la implementación. Los tipos integrales y flotantes se denominan colectivamente tipos aritméticos. Las especializaciones de la plantilla estándar std :: numeric_limits (18.3) especificarán los valores máximos y mínimos de cada tipo aritmético para una implementación.
Puede intentar utilizar una biblioteca que ofrezca compatibilidad de tipos de datos multiplataforma.
"Los tipos integrales C ++ heredados de C son un peligro multiplataforma. Int, long y los amigos tienen diferentes tamaños en diferentes plataformas (32 bits y 64 bits en los sistemas actuales, tal vez 128 bits más adelante). Para algunas aplicaciones podría parecen irrelevantes porque nunca se acercan al límite de 32 bits (o más bien de 31 bits si usa números enteros sin signo), pero si serializa sus objetos en un sistema de 64 bits y deserializa en un sistema de 32 bits, puede sentirse desagradablemente sorprendido.
APR proporciona un conjunto de tipos para tipos básicos que pueden ser diferentes en diferentes plataformas. Estos typedefs proporcionan un tamaño garantizado y evitan los tipos incorporados difusos. Sin embargo, para algunas aplicaciones (principalmente numéricas) a veces es importante usar el tamaño de la palabra de la máquina nativa (típicamente lo que significa int) para lograr el máximo rendimiento ".
Gigi SAYFAN - Construyendo su propio marco de complemento (De http://philippe.ameline.free.fr/techytechy/071125_PluginFramework.htm )
Quiero señalar que incluso si tiene flotadores del mismo tamaño, no puede estar seguro de que estas carrozas se interpreten de la misma manera en diferentes plataformas. Puede leer muchos artículos sobre ''flotadores en la red''. Flota no determinismo es un problema conocido.
Extracto del estándar C99, anexo normativo F (El estándar C ++ no menciona explícitamente este anexo, aunque incluye todas las funciones afectadas sin cambios por referencia. Además, los tipos tienen que coincidir para la compatibilidad):
Aritmética de punto flotante IEC 60559
F.1 Introducción
1 Este anexo especifica el soporte de lenguaje C para el estándar de punto flotante IEC 60559. El estándar de punto flotante IEC 60559 es específicamente aritmética de punto flotante binario para sistemas de microprocesador, segunda edición (IEC 60559: 1989), previamente designada IEC 559: 1989 y como estándar IEEE para aritmética de punto flotante binario (ANSI / IEEE 754-1985 ) El estándar IEEE para la aritmética de punto flotante independiente de la base (ANSI / IEEE 854-1987) generaliza el estándar binario para eliminar dependencias en la longitud de la raíz y de la palabra. IEC 60559 generalmente hace referencia al estándar de coma flotante, como en la operación IEC 60559, el formato IEC 60559, etc. Una implementación que define
__STDC_IEC_559__
debe cumplir con las especificaciones de este anexo.356) Donde una unión entre el lenguaje C y IEC 60559 es indicado, el comportamiento especificado por IEC 60559 se adopta por referencia, a menos que se indique lo contrario. Como el infinito negativo y el positivo se pueden representar en los formatos IEC 60559, todos los números reales se encuentran dentro del rango de valores representables.
Por lo tanto, incluya <math.h>
(o en C ++ tal vez <cmath>
) y pruebe __STDC_IEC_559__
.
Si se define la macro, no solo se especifican mejor los tipos ( float
es de 32bits y double
es de 64bits entre otros), sino que también se especifica más el comportamiento de los operadores integrados y las funciones estándar.
La falta de macro no da ninguna garantía.
Para x86 y x86_64 (amd64), puede confiar en que los tipos float
y double
cumplen con IEC-60559, aunque las funciones que los usan y las operaciones en ellos pueden no serlo.