cifras significativas C ++
-
25-09-2019 - |
Pregunta
¿Cómo puedo hacer matemáticas que implica cifras significativas en C ++? Quiero que esto funcione correctamente con los datos medidos a partir de experimentos de química y física. Un ejemplo: 65/5 = 10. Me tendría que deshacerse de cifras decimales que no sean necesarios y reemplazar algunos dígitos con 0s.
Gracias!
Solución
Bueno, hay buena matemáticas bibliotecas en math.h
También el almacenamiento de sus datos en los flotadores, dobles o dobles largos permitirá operaciones más precisas.
Los flotadores ofrecen 7 dígitos significativos, mientras que los dobles ofrecen 16 dígitos significativos.
También cuando se imprime a cabo por lo general la gente usa _snprintf o printf y se puede formatear esos dobles, flota a la precisión que se desee como:
flotador de precisión
printf ( "Valor% 8.2f", floatVariable);
Esto dice que necesita un total Campo de 8 caracteres, dentro de la 8 personajes de las últimas 2 sostendrán el parte decimal.
_snprintf (buffer, sizeof (tampón), "Valor% .2f", floatVariable);
El ejemplo anterior pide al ancho de campo mínimo y los dos últimos caracteres son a bodega la parte decimal.
Otros consejos
Esto debe conseguir lo que necesita:
std::cout.precision(x); // x would be the number of significant figures to output
Esto no puede ser la manera más eficiente, pero puede crear una costumbre sig tipo de datos fig.
class SigFigFloat
{
SigFigFloat(vector<short> digits, int decimalIndex, bool negative);
SigFigFloat operator+(const SigFigFloat &value);
SigFigFloat operator-(const SigFigFloat &value);
//etc...
}
Puede ser un montón de trabajo, pero si la aplicación de este derecho, puede ser una forma muy flexible para representar y hacer cálculos con higos de los sig.
Es difícil porque las cifras significativas son un concepto decimal, y las computadoras parecen ser binario. Puede utilizar las clases de números decimales (no sé de cualquier), o el uso impulso :: intervalo , que es el más cercano a lo que sin duda quiere lograr.
Eso depende de cómo se está mostrando ellos. Si está utilizando la función printf familiar, se establece la precisión (sprintf(buffer, "%.2f", myfloat)
). Si está utilizando ostreams, se llama a la función de la precisión para establecer el número de decimales. Si usted está buscando el método más científico de sig higos, usted tiene que escribir una función personalizada que determina la precisión basado en el valor actual del flotador.
aquí hay una rápida C ++ 11 solución que funcionó para mí:
int sig_figs = 3;
double number = 1562.654478;
std::cout << "original number:" << number << std::endl;
number = ([number](int number_of_sig_figs)->double{
std::stringstream lStream;
lStream << std::setprecision(number_of_sig_figs) << number;
return std::stod(lStream.str());
})(sig_figs);
std::cout << "rounded number:" << number << std::endl;