c++ - programacion - Tipos de punto flotante de tamaño fijo
punto flotante metodos numericos (4)
En los stdint.h
(C99), boost/cstdint.hpp y cstdint
(C ++ 0x) hay, entre otros, el tipo int32_t
.
¿Hay tipos de puntos flotantes de tamaño fijo similares? Algo así como float32_t
?
Actualmente existe una propuesta para agregar los siguientes tipos al idioma:
decimal32
decimal64
decimal128
que algún día se podrá acceder a través de #include <decimal>
.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html
Nada de esto existe en los estándares C o C ++ en la actualidad. De hecho, ni siquiera hay una garantía de que float
sea un formato binario de coma flotante.
Algunos compiladores garantizan que el tipo de float
será el formato binario IEEE-754 de 32 bits. Algunos no. En realidad, float
es de hecho el tipo single
IEEE-754 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 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 tipo de datos. Si esto se agregara a C, espero que el estándar de C ++ siga el ejemplo ... eventualmente.
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 SO familiar, el compilador, que tampoco puede mirar fuera de su pequeño nido.
Existe hardware que ejecuta de forma nativa operaciones de punto flotante IEEE de 32 bits y otras que lo hacen a 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.
Si desea saber si su 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 quieres ser más std::numeric_limits<float>::digits
balas, también verifica std::numeric_limits<float>::digits
para asegurarte de que no están a escondidas usando la precisión doble estándar IEEE para float
. Debería ser 24.
Cuando se trata del long double
, es más importante verificar los 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 tener float32_t
como tal porque generalmente quiere usar hardware de coma flotante, si está disponible, y no recurrir a una implementación de software.