Domanda

Come posso fare matematica che coinvolge cifre significative in C ++? Voglio che questo per funzionare correttamente con i dati misurati da esperimenti chimica e fisica. Un esempio: 65/5 = 10. Ho avuto bisogno di liberarsi di cifre decimali non necessari e sostituire alcune cifre con 0s.

Grazie!

È stato utile?

Soluzione

Beh ci sono buona matematica librerie in math.h

memorizzare anche le vostre figure galleggianti, doppie o lunghe doppie permetterà operazioni più precise.

I galleggianti offrono 7 cifre significative, mentre doppie offrono 16 cifre significative.

fonte

Anche quando la stampa di solito la gente usa _snprintf o printf e si può formattare quelle doppie, galleggia alla precisione che si desidera come:

  

Float Precisione

     

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

     

Questo dice si richiede un totale   Campo di 8 caratteri, all'interno della 8   personaggi gli ultimi 2 terrà il   parte decimale.

     

_snprintf (tampone, sizeof (buffer), "Valore% .2f", floatVariable);

     

L'esempio precedente   richiede la larghezza del campo minimo e   gli ultimi due personaggi sono a hold   la parte decimale.

Altri suggerimenti

Questo dovrebbe ottenere quello che ti serve:

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

Questo non può essere il modo più efficace, ma è possibile creare il tipo di dati di fico in ordine a una consuetudine.

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


}

Può essere un sacco di lavoro, ma se si sceglie di implementare questo diritto, può essere un modo davvero flessibile per rappresentare e fare calcoli con i fichi sig.

E 'difficile perché cifre significative sono un concetto decimali, e computer parlano binario. È possibile utilizzare decimali classi numero (non so di qualsiasi), o l'uso boost :: intervallo , che è più vicino a quello che sicuramente vuole raggiungere.

Questo dipende da come li state visualizzando. Se si utilizza il printf-famiglia, è possibile impostare la precisione (sprintf(buffer, "%.2f", myfloat)). Se si utilizza ostreams, si chiama la funzione di precisione per impostare il numero di cifre decimali. Se siete alla ricerca per il metodo più scientifico di fichi SIG, dovrete scrivere una funzione personalizzata che determina la precisione in base al valore corrente del flottante.

: ecco un breve C ++ 11 soluzione che ha funzionato per me:

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top