En los encabezados stdint.h
(C99), boost / cstdint.hpp y cstdint
(C ++ 0x) se encuentra, entre otros, el tipo int32_t
.
¿Existen tipos de coma flotante de tamaño fijo similares? Algo como float32_t
?
En los encabezados stdint.h
(C99), boost / cstdint.hpp y cstdint
(C ++ 0x) se encuentra, entre otros, el tipo int32_t
.
¿Existen tipos de coma flotante de tamaño fijo similares? Algo como float32_t
?
sizeof
operador. Un tipo como este sería útil cuando un algoritmo requiere que tenga un tamaño específico conocido.
sizeof
puede utilizar para resolver el problema de ordenar y deshacer consistentemente tipos flotantes?
Respuestas:
No existe nada parecido 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 float
tipo será el formato binario de 32 bits IEEE-754. Algunos no. En realidad, float
es del tipo IEEE-754 single
en la mayoría de las 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 que discute la adición de enlaces de lenguaje C para la revisión de 2008 de IEEE-754, que podría considerar recomendar que se agregue tal typedef. Si esto se agrega a C, espero que el estándar C ++ siga su ejemplo ... eventualmente.
Si desea saber si float
es del tipo IEEE de 32 bits, verifique std::numeric_limits<float>::is_iec559
. Es una constante en tiempo de compilación, no una función.
Si desea ser más a prueba de balas, también verifique std::numeric_limits<float>::digits
que no estén usando furtivamente el estándar IEEE de doble precisión para float
. Debería ser 24.
Cuando se trata de long double
, es más importante verificar digits
porque hay un par de formatos IEEE que podrían ser razonablemente: 128 bits (dígitos = 113) u 80 bits (dígitos = 64).
No sería práctico tenerlo float32_t
como tal porque generalmente desea usar hardware de punto flotante, si está disponible, y no recurrir a una implementación de software.
long double
formato en OS X (Intel de 32 y 64 bits) es exactamente el formato doble extendido IEEE-754 almacenado en orden little-endian. No tiene nada de raro. Los bytes 0-7 contienen el campo de significado, y los bytes 8 y 9 contienen los campos de exponente y signo.
5.0L
tiene un significado de a000000000000000
. Su exponente insesgado es +2, y el sesgo del exponente doble 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 little-endian de 64 bits, verá exactamente lo que observó.
4001
en little-endian es 01 40 00 00 ...
Si nada más, el byte menos significativo es lo primero. Espero que la secuencia a0 01 40
aparezca en algún lugar del número (si solo realizaron una rotación) pero no creo que hayas explicado por qué a0
y 01 40
estás en mitades completamente separadas.
Si cree que tener typedefs como float32_t y float64_t no es práctico por alguna razón, debe estar demasiado acostumbrado a su sistema operativo conocido, el compilador, que no puede mirar fuera de su nido.
Existe hardware que ejecuta de forma nativa operaciones de punto flotante IEEE de 32 bits y otros que lo hacen de 64 bits. A veces, estos sistemas incluso tienen que comunicarse entre sí, en cuyo caso es extremadamente importante saber si un doble es de 32 bits 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 lanzar a la precisión más baja según los requisitos de tiempo y velocidad.
Personalmente, me siento incómodo usando flotadores y dobles a menos que sepa exactamente cuántos bits hay en mi plataforma. Más aún si tengo que transferirlos a otra plataforma a través de algún canal de comunicaciones.
Actualmente existe una propuesta para agregar los siguientes tipos al idioma:
decimal32
decimal64
decimal128
que algún día será accesible a través de #include <decimal>
.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html
decimal24
hacer cosas como leer archivos WAV con muestras de 24 bits más fáciles!