español - restablecer la precisión predeterminada C++
set precision c++ (3)
Quiero controlar la precisión de un doble durante una comparación, y luego volver a la precisión predeterminada, con C ++.
Tengo la intención de usar setPrecision()
para establecer la precisión. ¿Cuál es entonces la sintaxis, si hay alguna, para volver a establecer la precisión como predeterminada?
Estoy haciendo algo como esto
std::setPrecision(math.log10(m_FTOL));
Hago algunas cosas, y me gustaría volver a la comparación doble predeterminada inmediatamente después.
Modifiqué así, y todavía tengo algunos errores
std::streamsize prec = std::ios_base::precision();
std::setprecision(cmath::log10(m_FTOL));
con cmath
falso en la compilación, y std::ios_base
también es falso en la compilación. ¿Podrías ayudar?
Gracias.
Debe realizar un seguimiento de su precisión actual y luego reiniciar de nuevo a la misma una vez hecho con sus operaciones con la precisión modificada requerida. Para esto puedes usar std :: ios_base :: precision :
streamsize precision ( ) const;
streamsize precision ( streamsize prec );
La primera sintaxis devuelve el valor del campo de precisión de punto flotante actual para la transmisión.
La segunda sintaxis también lo establece en un nuevo valor.
setprecision () solo se puede usar para operaciones de salida y no se puede usar para comparaciones
Para comparar flotantes, di a y b, tienes que hacerlo explícitamente así:
if( abs(a-b) < 1e-6) {
}
else {
}
Puede obtener la precisión antes de cambiarla, con std::ios_base::precision
y luego usar eso para volver a cambiarla más tarde.
Puedes ver esto en acción con:
#include <ios>
#include <iostream>
#include <iomanip>
int main (void) {
double d = 3.141592653589;
std::streamsize ss = std::cout.precision();
std::cout << "Initial precision = " << ss << ''/n'';
std::cout << "Value = " << d << ''/n'';
std::cout.precision (10);
std::cout << "Longer value = " << d << ''/n'';
std::cout.precision (ss);
std::cout << "Original value = " << d << ''/n'';
std::cout << "Longer and original value = "
<< std::setprecision(10) << d << '' ''
<< std::setprecision(ss) << d << ''/n'';
std::cout << "Original value = " << d << ''/n'';
return 0;
}
qué salidas:
Initial precision = 6
Value = 3.14159
Longer value = 3.141592654
Original value = 3.14159
Longer and original value = 3.141592654 3.14159
Original value = 3.14159
El código anterior muestra dos formas de establecer la precisión, primero llamando a std::cout.precision (N)
y segundo usando un manipulador de flujo std::setprecision(N)
.
Pero debe tener en cuenta que la precisión es para generar valores a través de transmisiones, no afecta directamente las comparaciones de los valores con códigos como:
if (val1== val2) ...
En otras palabras, aunque la salida puede ser 3.14159
, el valor en sí mismo sigue siendo el 3.141592653590
completo (sujeto a las limitaciones normales de punto flotante, por supuesto).
Si quiere hacer eso, necesitará verificar si está lo suficientemente cerca en vez de igual, con un código como:
if ((fabs (val1 - val2) < 0.0001) ...