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
es el mayor valor representable, si::infinity() T
soporta infinito. Es, por supuesto, el infinito. Si el tipoT
admite infinito se indica mediantestd::numeric_limits
.::has_infinity -
std::numeric_limits
es el mayor valor finito. Para::max() double
esto es 21024−2971aproximadamente 1,79769•10308. -
std::numeric_limits
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() min()
es el punto donde comienza esta pérdida de precisión. Paradouble
esto es 2−1022aproximadamente 2,22507•10−308. -
std::numeric_limits
es el valor positivo más pequeño. En tipos que tienen valores subnormales, es subnormal. De lo contrario, es igual::denorm_min() std::numeric_limits
. Para::min() double
esto es 2−1074aproximadamente 4,94066•10−324. -
std::numeric_limits
es el menor valor finito. Por lo general, es un número negativo de gran magnitud. Para::lowest() double
esto es −(21024−2971), aproximadamente −1.79769•10308. -
Si
std::numeric_limits
y::has_infinity std::numeric_limits
son trueentonces::is_signed -std::numeric_limits
es el valor mínimo. Es, por supuesto, infinito negativo.::infinity()
Otra característica que te puede interesar es:
std::numeric_limits
es el mayor número de dígitos decimales tal que convertir cualquier número decimal con tantos dígitos a::digits10 T
y luego volver a convertir al mismo número de dígitos decimales producirá el número original. Paradouble
esto es 15.
Todo se encuentra en numeric_limits.
Pero TENER CUIDADO
Por alguna razón que desconozco, std::numeric_limits
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
. 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.