setprecision español c++ floating-point default precision rounding

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) ...