Pregunta ¿Cómo prevenir el error de redondeo en c ++?


¿Cómo puedo prevenir el error de redondeo en C ++ o solucionarlo?

Ejemplo:

float SomeNumber = 999.9999;
cout << SomeNumber << endl;

¡Imprime 1000!


5
2017-09-28 14:12


origen


Respuestas:


Puedes alterar el redondeo realizado por cout ajustando la precisión.

cout.precision(7);
float SomeNumber  = 999.9999;
cout << SomeNumber  << endl;

Alternativamente, puedes usar printf de cstdio.


4
2017-09-28 14:17



Por defecto, la salida formateada vía std::ostream redondea los valores de coma flotante a seis cifras decimales significativas. Necesitas siete para evitar que tu número se redondee a 1000:

cout << setprecision(7) << SomeNumber << endl;
        ^^^^^^^^^^^^^^^

Además, tenga en cuenta que está cerca del límite de la precisión de float, asumiendo la representación IEEE de 32 bits comúnmente utilizada. Si necesita más de siete cifras significativas, deberá cambiar a double. Por ejemplo, las siguientes impresiones 1000, no importa cuánta precisión especifiques:

float SomeNumber = 999.99999; // 8 significant figures
cout << setprecision(10) << SomeNumber << endl;

3
2017-09-28 14:20



Para prevenir su salida siendo redondeado, use setprecision en iomanip.

float SomeNumber = 999.9999;
std::cout << SomeNumber << std::endl; //outputs 1000
std::cout << std::setprecision (7) << SomeNumber << std::endl; //outputs 999.9999
return 0;

El valor real almacenado en SomeNumber siempre será 999.9999, por lo que no tendrá que preocuparse por el valor en sí (a menos que necesite más precisión que la que proporciona float).


1
2017-09-28 14:21



Como se mencionó anteriormente, si solo está buscando la corrección de redondeo de cout, use la función .precision. Si se refiere a la incapacidad de los puntos flotantes para representar todas las fracciones posibles, lea a continuación:

No puede evitar tales errores de redondeo utilizando números de coma flotante. Necesitas representar tus datos de una manera diferente. Por ejemplo, si quiere 5 dígitos de precisión, simplemente guárdelo como un largo que represente el número de sus unidades más pequeñas.

Es decir. 5.23524 w / precision at 0.00001 se puede representar en un largo (o int si su rango de valores se ajusta) como 523524. Usted sabe que las unidades son 0.00001 por lo que puede hacer que funcione.


0
2017-09-28 14:21