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
?
c++
c
boost
floating-point
Pietro
fuente
fuente
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-754single
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.
fuente
Si desea saber si
float
es del tipo IEEE de 32 bits, verifiquestd::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 parafloat
. Debería ser 24.Cuando se trata de
long double
, es más importante verificardigits
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.fuente
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 dea000000000000000
. Su exponente insesgado es +2, y el sesgo del exponente doble extendido es3fff
, por lo que el exponente sesgado para 5.0L es4001
. El patrón de bytes real cuando se almacena en orden little-endian es00 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 es01 40 00 00 ...
Si nada más, el byte menos significativo es lo primero. Espero que la secuenciaa0 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
y01 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.
fuente
Actualmente existe una propuesta para agregar los siguientes tipos al idioma:
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
fuente
decimal24
hacer cosas como leer archivos WAV con muestras de 24 bits más fáciles!