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!

¿Fue útil?

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.

fuente

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top