Saltar al contenido

¿Cuáles son los valores mínimos/máximos reales para float y double (C++)?

Luego de mirar en diversos repositorios y sitios webs finalmente hemos descubierto la solución que te mostraremos más adelante.

Solución:

Bien. Usando lo que aprendí de aquí (gracias a todos) y las otras partes de la web, escribí un pequeño resumen de los dos en caso de que me encuentre con otro problema como este.

En C++ hay dos formas de representar/almacenar valores decimales.

Flotadores y Dobles

Un flotador puede almacenar valores de:

  • -340282346638528859811704183484516925440.0000000000000000 Flotante más bajo
  • 340282346638528859811704183484516925440.0000000000000000 Flotador máx.

Un doble puede almacenar valores de:

  • -179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000000000 Double lowest

  • 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000000000 Double max

La precisión de Float le permite almacenar un valor de hasta 9 dígitos (7 dígitos reales, +2 de conversión decimal a binaria)

Doble, como sugiere el nombre, puede almacenar el doble de precisión que un flotador. Puede almacenar hasta 17 dígitos. (15 dígitos reales, +2 de conversión decimal a binaria)

p.ej

     float x = 1.426;
     double y = 8.739437;

Decimales y matemáticas

Debido a que un flotador puede transportar 7 real decimales, y un doble pudiendo llevar 15 real decimales, para imprimirlos al realizar los cálculos se debe utilizar un método adecuado.

p.ej

incluir

typedef std::numeric_limits dbl; 
cout.precision(dbl::max_digits10-2); // sets the precision to the *proper* amount of digits.
cout << dbl::max_digits10 <

ejemplo 2:

typedef std::numeric_limits< float> flt;
cout.precision(flt::max_digits10-2);
cout << flt::max_digits10 <

Aproximadamente, ¿qué tan precisa es esta descripción? ¿Se puede usar como estándar cuando se confunde?

Él std::numerics_limits clase en el El encabezado proporciona información sobre las características de los tipos numéricos.

Para un tipo de punto flotante T, aquí están los valores mayor y menor representables en el tipo, en varios sentidos de "mayor" y "menor". También incluyo los valores para el tipo binario común IEEE 754 de 64 bits, que se llama double en esta respuesta. Estos son en orden decreciente:

  • std::numeric_limits::infinity() es el mayor valor representable, si T soporta infinito. Es, por supuesto, el infinito. Si el tipo T admite infinito se indica mediante std::numeric_limits::has_infinity.

  • std::numeric_limits::max() es el mayor valor finito. Para doubleesto es 21024−2971aproximadamente 1,79769•10308.

  • std::numeric_limits::min() es el valor normal positivo más pequeño. Los formatos de punto flotante a menudo tienen un intervalo en el que el exponente no puede reducirse, pero la parte significativa (la parte fraccionaria del número) puede reducirse hasta llegar a cero. Esto se produce a expensas de la precisión, pero tiene algunas propiedades deseables de cálculo matemático. min() es el punto donde comienza esta pérdida de precisión. Para doubleesto es 2−1022aproximadamente 2,22507•10−308.

  • std::numeric_limits::denorm_min() es el valor positivo más pequeño. En tipos que tienen valores subnormales, es subnormal. De lo contrario, es igual std::numeric_limits::min(). Para doubleesto es 2−1074aproximadamente 4,94066•10−324.

  • std::numeric_limits::lowest() es el menor valor finito. Por lo general, es un número negativo de gran magnitud. Para doubleesto es −(21024−2971), aproximadamente −1.79769•10308.

  • Si std::numeric_limits::has_infinity y std::numeric_limits::is_signed son trueentonces -std::numeric_limits::infinity() es el valor mínimo. Es, por supuesto, infinito negativo.

Otra característica que te puede interesar es:

  • std::numeric_limits::digits10 es el mayor número de dígitos decimales tal que convertir cualquier número decimal con tantos dígitos a T y luego volver a convertir al mismo número de dígitos decimales producirá el número original. Para doubleesto es 15.

Todo se encuentra en numeric_limits.

Pero TENER CUIDADO

Por alguna razón que desconozco, std::numeric_limits:min() no devuelve el mínimo flotante. En su lugar, devuelve el valor flotante positivo más pequeño que se representa en forma normalizada. Para obtener el mínimo, utilice std::numeric_limits::lowest(). No es broma. Del mismo modo para otros tipos de punto flotante, es decir double y long double.

http://en.cppreference.com/w/cpp/types/numeric_limits

Te invitamos a añadir valor a nuestra información colaborando tu veteranía en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Respuestas a preguntas comunes sobre programacion y tecnología