2011-01-05 6 views
6

Wie kann ich Mathematik mit signifikanten Zahlen in C++ erstellen? Ich möchte, dass dies mit gemessenen Daten aus Chemie- und Physikexperimenten korrekt funktioniert. Ein Beispiel: 65/5 = 10. Ich müsste unnötige Dezimalstellen loswerden und einige Ziffern durch 0 ersetzen.C++ signifikante Zahlen

Danke!

+7

5., 5.0, 5,00000000 sind gleich in der Darstellung des Computers. Sprechen Sie darüber, wie Sie das Ergebnis mit 2 signifikanten Zahlen anzeigen können? – kennytm

+0

Ja, ich bin.Ich werde meinen Beitrag bearbeiten, um das zu sagen. – joshim5

+1

Ich nehme an, er bedeutet in Fällen, in denen seine 3,5 * 1,00 * pi er es mit 3.5 * 1.0 * 3.1 berechnen will (es sei denn, ich bin verwirrt) –

Antwort

-1

Nun gibt es good math libraries in math.h

Auch Ihre Figuren in Schwimmern speichern, verdoppelt oder lang verdoppelt wird für präzisere Operationen ermöglichen.

Floats bieten 7 signifikante Ziffern, während Double 16 signifikante Ziffern bieten.

source

Auch wenn in der Regel Menschen _snprintf oder printf Ausdrucken und Sie diese Doppel formatieren können, schwebt der Präzision Sie wollen:

Float Precision

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

Dies sagt Ihnen insgesamt Feld von 8 Zeichen erfordern, innerhalb der 8 Zeichen der letzten 2 den Dezimalteil halten.

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

Das obige Beispiel fordert die minimale Feldbreite an und die letzten zwei Zeichen sollen den Dezimalteil halten.

+5

das ist „Stellen nach dem Komma“, nicht [signifikante Zahlen] (https://en.wikipedia.org/wiki/Significant_figures). Für Wissenschaftler und Ingenieure gibt es einen sehr wichtigen Unterschied zwischen den beiden. – bdesham

6

Dies sollten Sie bekommen, was Sie brauchen:

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

würde ich schreiben: cout.precision (2) < <54343; wenn ich 5.3 anzeigen wollte? – joshim5

+0

Correct - hier ist es eine Dokumentation über sie: http://www.cplusplus.com/reference/iostream/ios_base/precision/ –

1

schwierig weil signifikante Zahlen ein Dezimal-Konzept sind, und Computer binär sprechen. Sie können Dezimalzahlklassen verwenden (von denen ich keine weiß), oder boost::interval verwenden, was am ehesten dem entspricht, was Sie sicher erreichen möchten.

+0

+1 für Intervallarithmetik was darauf hindeutet, obwohl es hier zu viel des Guten kann, es geht um noch etwas wert ist, zu wissen :) –

4

Dies ist möglicherweise nicht der effizienteste Weg, aber Sie können einen benutzerdefinierten Sig fig-Datentyp erstellen.

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


} 

Es kann eine Menge Arbeit, aber wenn Sie dieses Recht umsetzen, kann es eine wirklich flexible Art und Weise darzustellen und zu tun Berechnungen mit sig Feigen sein.

+0

Wenn ich dies tat, würde ich nicht nur signifikante Zahlen verfolgt, würde ich den Fehlerbereich verfolgt, nicht nur die Anzahl der signifikanten Zahlen. Das würde mir erlauben, mit Zahlen wie 123 ± 0,2 oder 123 ± 0,7 zu ​​arbeiten, während signifikante Zahlen nur Zahlen wie 123 ± 0,5 erlauben – Steve

1

Das hängt davon ab, wie Sie sie anzeigen. Wenn Sie die printf-Familie verwenden, legen Sie die Genauigkeit fest (sprintf(buffer, "%.2f", myfloat)). Wenn Sie Ostreams verwenden, rufen Sie die Genauigkeitsfunktion auf, um die Anzahl der Dezimalstellen festzulegen. Wenn Sie nach der wissenschaftlicheren Methode der Sig- nale suchen, müssen Sie eine benutzerdefinierte Funktion schreiben, die die Genauigkeit basierend auf dem aktuellen Wert des Floats bestimmt.

0

hier ist eine schnelle C++ 11-Lösung, die für mich gearbeitet:

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;