2010-08-11 12 views
44

Sé que el tamaño de varios tipos de datos puede cambiar dependiendo del sistema en el que estoy. yo uso de 32 bits de XP, y usando el operador sizeof() en C++, parece que a largo doble es de 12 bytes, y doble es 8.double double vs double

Sin embargo, la mayoría de las fuentes principales estados que a largo doble es de 8 bytes, y el rango es por lo tanto lo mismo que un doble.

¿Cómo es que tengo 12 bytes? Si el doble largo es de hecho 12 bytes, ¿no extiende esto también el rango de valores? ¿O la firma larga solo se usa (las cifras del compilador) cuando el valor excede el rango de un doble, y por lo tanto, se extiende más allá de 8 bytes?

Gracias.

+2

Esta es la peor característica en ISO C. Le recomiendo encarecidamente que no la use. Solo genera problemas porque la especificación es muy flexible. – Jeff

Respuesta

49

Citando de Wikipedia:

en la arquitectura x86, la mayoría de los compiladores implemento largo doble como el 80-bit de tipo de precisión extendido el apoyo de que el hardware (a veces almacenado como 12 o 16 bytes para mantener la estructura de datos

.

y

compiladores también pueden utilizar a largo doble para un formato cuádruple precisión de 128 bits, que es actualmente implementado en software.

En otras palabras, sí, un long double puede ser capaz de almacenar un mayor rango de valores de un double. Pero depende completamente del compilador.

+2

Los tipos de datos dependen en gran medida de la arquitectura que está desarrollando. – karlphillip

+0

También depende de las opciones del compilador. El tipo de 80 bits se puede deshabilitar explícitamente en casi todos los compiladores x86. – greyfade

+1

@karlphillip, @greyfade: Sí, solo quise decir "hasta el compilador" en el sentido de que decide cómo almacenar tus datos. Obviamente, está limitado a lo que está disponible en la plataforma y, por supuesto, el compilador puede elegir permitir que el usuario lo anule. – Borealid

2

Los tamaños de byte estándar para números son los tamaños mínimos garantizados en todas las plataformas. Pueden ser más grandes en algunos sistemas, pero nunca serán más pequeños.

1

En cuanto a mi experiencia de novato de programación le:

  • Uso flotador periodicaly normalizada [-1.0, 1.0 +]

  • valor de normalización de retención por separado con doble o doble largo

  • La normalización introduce ruido = pequeños errores = altas frecuencias a variables valores

  • de vez en cuando es útil para normalizar con el valor de la mediana mantener por separado y mantener los datos ordenados (orden de datos original se podría ahorrar vector como la permutación)

1

Para los compiladores modernos en x64, Clang y usos del CCG Doble de 16 bytes para long double, mientras que VC++ utiliza un doble de 8 bytes. En otras palabras, con Clang y GCC obtiene una mayor precisión doble, pero para VC++ long double es lo mismo que double. Las CPU x86 modernas son compatibles con estos dobles de 16 bytes, por lo que creo que Clang y GCC están haciendo lo correcto y le permiten acceder a la capacidad de hardware de nivel inferior utilizando primitivas de lenguaje de nivel superior.