El doble tiene un rango mayor que un entero de 64 bits, pero su precisión es menos costosa para su representación (ya que el doble también es de 64 bits; se ajusta a más valores reales). Entonces, al representar números enteros más grandes, comienzas a perder precisión en la parte entera.Buscar el tamaño máximo entero que un tipo de punto flotante puede manejar sin pérdida de precisión
#include <boost/cstdint.hpp>
#include <limits>
template<typename T, typename TFloat>
void
maxint_to_double()
{
T i = std::numeric_limits<T>::max();
TFloat d = i;
std::cout
<< std::fixed
<< i << std::endl
<< d << std::endl;
}
int
main()
{
maxint_to_double<int, double>();
maxint_to_double<boost::intmax_t, double>();
maxint_to_double<int, float>();
return 0;
}
Esta impresora:
2147483647
2147483647.000000
9223372036854775807
9223372036854775800.000000
2147483647
2147483648.000000
Nota cómo máximo int
puede caber en un double
sin pérdida de precisión y boost::intmax_t
(64 bits en este caso) no puede. float
ni siquiera puede contener un int
.
Ahora, la pregunta: ¿Hay alguna manera en C++ para verificar si todo el rango de un tipo de entero dado puede caber en un tipo de punto de equilibrio sin pérdida de precisión?
Preferiblemente,
- sería una comprobación en tiempo de compilación que se puede utilizar en una afirmación estática,
- y no implicaría la enumeración de las constantes del compilador debe saber o puede calcular.
¿Por qué tienes que comprobar? La parte entera tiene 52 bits de precisión, así que eso es cuánto obtienes. –
Una vez que haya determinado el límite, ¿no puede simplemente definir un CONST? –
@Billy: _Technically_ C++ no requiere punto flotante IEEE 754, por lo que suponiendo que la implementación usa IEEE 754 no es portátil (a pesar de que el IEEE 754 es omnipresente). –