2010-03-26 26 views
59

En los encabezados stdint.h (C99), boost/cstdint.hpp y cstdint (C++ 0x) hay, entre otros, el tipo int32_t.Tipos de coma flotante de tamaño fijo

¿Hay tipos de coma flotante de tamaño fijo similares? Algo así como float32_t?

+4

¿Por qué necesita algo así? – AraK

+1

Pietro, parece que quizás no entiendas cómo funcionan las carrozas. –

+30

Necesita algo así cuando tiene una estructura de datos con un valor de coma flotante y también quiere saber exactamente cuál es su tamaño. – mob

Respuesta

37

Nada de esto existe en los estándares C o C++ en la actualidad. De hecho, ni siquiera hay garantía de que float sea un formato binario de punto flotante.

Algunos compiladores garantizan que el tipo float será el formato binario IEEE-754 de 32 bits. Algunos no. En realidad, float es de hecho el tipo IEEE-754 single en más plataformas no integradas, aunque se aplican las advertencias habituales sobre algunos compiladores que evalúan expresiones en un formato más amplio.

Hay un grupo de trabajo discutiendo la adición de enlaces de lenguaje C para la revisión 2008 de IEEE-754, que podría considerar recomendar que se agregue dicho typedef. Si esto se agregara a C, espero que el estándar de C++ siga el ejemplo ... eventualmente.

+0

Espero que el grupo de trabajo enlace C/C++ a IEEE-754. Por lo tanto, si desea la portabilidad, puede obtenerla más fácilmente y, si no la necesita, puede seguir utilizando los tipos antiguos dependientes de la plataforma. – Pietro

+2

Independientemente de IEEE-754 o no, aún así no impedirá problemas de portabilidad endian. –

+1

@Pietro: cambiar el idioma no afectará la compatibilidad de su hardware, solo impediría el cumplimiento de parte del hardware. ¿Cómo ayudaría una garantía IEEE FP a la portabilidad? – Potatoswatter

22

Si desea saber si su float es del tipo IEEE de 32 bits, marque std::numeric_limits<float>::is_iec559. Es una constante en tiempo de compilación, no una función.

Si quieres estar más a prueba de balas, también comprobar std::numeric_limits<float>::digits para asegurarse de que no están escondidas utilizando el estándar IEEE de precisión doble estándar para float. Debe ser 24.

Cuando se trata de long double, es más importante comprobar digits porque hay un par de formatos IEEE los que se pudiera razonablemente: 128 bits (dígitos = 113) o 80 bits (dígitos = 64).

No sería práctico tener float32_t como tal, ya que normalmente quiere utilizar hardware de coma flotante, si está disponible, y no recurrir a una implementación de software.

+0

El formato 'long double' en OS X (tanto Intel de 32 bits como de 64 bits) es exactamente el formato doble extendido IEEE-754 almacenado en orden little-endian. Nada de funky al respecto. Los bytes 0-7 contienen el campo significativo, y los bytes 8 y 9 contienen los campos exponente y de signo. –

+0

@Stephen: son buenas noticias: v). ¿Eso está de acuerdo con los números que publiqué? – Potatoswatter

+1

Recuerde que el doble extendido (a diferencia de los otros formatos 754) tiene un bit de significado principal explícito, por lo que '5.0L' tiene un significado de' a000000000000000'. Su exponente imparcial es +2, y el doble sesgo de exponente extendido es '3fff', por lo que el exponente sesgado para 5.0L es' 4001'.El patrón de bytes real cuando se almacena en orden little-endian es '00 00 00 00 00 00 00 a0 01 40', y si lo ve como dos enteros de 64 bits poco endian, verá exactamente lo que observó. –

13

Si cree que tener typedefs como float32_t y float64_t no son prácticos por alguna razón, debe estar demasiado acostumbrado a su sistema operativo familiar, el compilador, que tampoco puede mirar fuera de su pequeño nido.

Existe hardware que ejecuta operaciones de punto flotante IEEE de 32 bits y otras que lo hacen de 64 bits. En ocasiones, estos sistemas incluso tienen que hablar entre ellos, en cuyo caso es extremadamente importante saber si un doble es de 32 o 64 bits en cada plataforma. Si la plataforma de 32 bits hiciera cálculos excesivos sobre la base de los valores de 64 bits de la otra, es posible que deseemos proyectar con la precisión más baja en función de los requisitos de tiempo y velocidad.

Personalmente me siento incómodo usando flotadores y dobles a menos que sepa exactamente cuántos bits están en mi platfrom. Aún más si tengo que transferirlos a otra plataforma a través de algún canal de comunicaciones.

+0

"Personalmente, me siento incómodo al usar flotadores y dobles a menos que sepa exactamente cuántos bits están en mi plataforma, más aún si tengo que transferirlos a otra plataforma a través de algún canal de comunicaciones". - ¿Quiere decir que usa formatos de archivo de texto? Con estos, existe la desventaja del tamaño del archivo: un flotador de 32 necesita 4 bytes; estos en forma de texto pueden representar un número de cuatro dígitos solamente ... – Pietro

2

En la actualidad existe una propuesta para añadir los siguientes tipos en el idioma:

decimal32 
decimal64 
decimal128 

que puede un día ser accesible a través de #include <decimal>.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html

+1

De acuerdo, los tipos decimales no son los tipos de coma flotante IEEE 754. –

Cuestiones relacionadas