Question

Comment puis-je faire des mathématiques impliquant des chiffres significatifs en C ++? Je veux que cela fonctionne correctement avec les données mesurées à partir d'expériences de chimie et de physique. Un exemple: 65/5 = 10. Je besoin de se débarrasser des décimales non nécessaires et remplacer certains chiffres avec 0s.

Merci!

Était-ce utile?

La solution

Eh bien il y a bonnes bibliothèques mathématiques dans math.h

stocker également vos chiffres dans des viviers, doubles ou doubles longues permettra des opérations plus précises.

Flotteurs offrent 7 chiffres significatifs en double offrent 16 chiffres significatifs.

la source

En outre lors de l'impression des gens utilisent habituellement _snprintf ou printf et vous pouvez formater ces doubles, flotte à la précision que vous voulez comme:

  

Float Precision

     

printf ( "Valeur% 8.2f", floatVariable);

     

Cela vous dit besoin d'un total   domaine de 8 caractères, au sein de la 8   caractères les 2 derniers détiendront la   partie décimale.

     

_snprintf (buffer, sizeof (tampon), "Value% .2f", floatVariable);

     

L'exemple ci-dessus   demande à la largeur minimale du champ et   les deux derniers caractères doivent tenir   la partie décimale.

Autres conseils

Cela devrait vous obtenir ce dont vous avez besoin:

std::cout.precision(x); // x would be the number of significant figures to output

Cela peut ne pas être le moyen le plus efficace, mais vous pouvez créer une sig fig type de données.

class SigFigFloat
{
  SigFigFloat(vector<short> digits, int decimalIndex, bool negative);
  SigFigFloat operator+(const SigFigFloat &value);
  SigFigFloat operator-(const SigFigFloat &value);
  //etc...


}

Il peut être beaucoup de travail, mais si vous mettez en œuvre ce droit, il peut être un moyen très souple pour représenter et faire des calculs avec des figues sig.

Il est difficile, car les chiffres significatifs sont un concept décimal, et les ordinateurs parlent binaire. Vous pouvez utiliser des classes de nombre décimal (je ne connais pas), ou utilisez boost :: intervalle , qui est le plus proche de ce que vous voulez certainement atteindre.

Cela dépend de la façon dont vous les afficher. Si vous utilisez la printf familiale, vous définissez la précision (sprintf(buffer, "%.2f", myfloat)). Si vous utilisez ostreams, vous appelez la fonction de précision pour définir le nombre de décimales. Si vous êtes à la recherche de la méthode plus scientifique des figues de sig, vous devez écrire une fonction personnalisée qui détermine la précision en fonction de la valeur actuelle du flotteur.

Voici une rapide solution 11 C ++ qui a fonctionné pour moi:

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top