c++, wie man "eine Ziffer exponent" mit printf
Gibt es eine Möglichkeit zum drucken in der wissenschaftlichen notation mit weniger als 3 stellen für exponent-Teil-Nummer?
6.1 Formatierung nicht beeinflussen exponent, sondern nur die Anzahl Artikel:
var=1.23e-9;
printf ("%e\n", var);
printf ("%6.1e\n", var);
gibt
1.230000e-009
1.2e-009
Habe ich auch versucht, diese in wxWidgets mit der Formatierung der Zeichenkette, aber das Verhalten ist das gleiche.
m_var->SetLabel(wxString::Format(wxT("%6.1e"),var));
Was ich möchte, ist 1.2e-9
.
Tatsächlich, so der standard ist und g++, es sollte das Ergebnis in zwei, die Ziffern für den Exponenten-Teil.
InformationsquelleAutor Kris_R | 2012-01-07
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe dazu eine Menge (ich Schreibe Datei-Parser und einige Datei-Formate wie NITF benötigen Sie zum speichern numerischer Werte in Form von strings).
Was Sie tun, ist ein exploit, der basiert auf, was Basis-10 Mathematik (wissenschaftliche Schreibweise) wirklich bedeutet: Es bedeutet, dass für alle reellen zahlen y, y = (x) * 10^(N) für integer N und in einigen x in den Bereich (-1, 1) exklusive.
Also, tun Sie den folgenden
Können Sie die Formatangaben müssen Sie die # of chars vor, nach dem "." Dezimalstelle.
Vergessen Sie NICHT, die Rundung Schritt! Dies ist, wie es funktioniert, mit den Eigenschaften base10 und Logarithmen (Basis 10):
Let y = x * 10^N =>
log(y) = log(x*10^N) =>
log(y) = log(x) + log(10^N) => //Aus den Log - "Produkt" - Regel
log(y) = log(x) + N
Da x in den Bereich (-10, 10) -"()" bedeutet ausschließliche(exklusive), impliziert, dass log(x) ist im Bereich (-1, 1). Also, wenn wir abrunden bei integer-Konvertierung, wir fallen "log(x)" Beitrag.
Sie können dann die "x" - Teil aus dem original-Nummer, die können Sie die Ausgabe der Originale in der wissenschaftlichen notation, die Sie verwenden möchten.
d
als 0, INF, NAN. Es wird auch führen Ungenauigkeiten inbase
.InformationsquelleAutor Zack Yezek
Laut Wikipedia:
_set_output_format
InformationsquelleAutor Ilya Kogan
Mit standard-C -
printf()
dies nicht getan werden kann (und die Verwendung von drei Ziffern standardmäßig scheint da auch irren), zumindest in C99 (ich habe nicht eine neuere version zur hand). Das relevante Zitat aus dem C99-standard ist bei 7.19.6.1 Absatz 8, Formate, e,f:Die beste Wette, um an diesem [Mobil] in code verwenden viele diese Ausgänge wird der Einsatz von C++ IOStreams: auch wenn die Standard-Formatierung ist die gleiche wie in C, es ist möglich, installieren Sie eine benutzerdefinierte Facette in den stream
std::locale
hat die Formatierung wie Sie Sie brauchen. Das heißt, schreiben Sie die Formatierung von code ist vielleicht nicht ganz trivial. Obwohl, ich würde wahrscheinlich nur gebaut auf der standard-Konvertierung und entfernen Sie dann die überschüssige Nullen nach dere
Charakter.InformationsquelleAutor Dietmar Kühl
Fand ich Zach ' s Antwort auf die Schnellste und einfachste Methode, und ist auch anwendbar auf jedem OS. Ich habe die Erfahrung gemacht, dass zwei Modifikationen erforderlich waren, die "base =" - Zeile, damit es funktioniert für alle zahlen. (Sonst nan ist, wenn der exponent negativ ist in cygwin). Der zusätzliche print-Anweisung ist nur für patran-neutral-Datei-Kompatibilität. Ich hätte von Ihnen positiv bewertet werden, seine Antwort, aber ich habe gerade angefangen, auf stackexchange, so habe ich nicht ausreichend "Ruf".
InformationsquelleAutor Brad Porter
C/C++ gibt mindestens zwei Exponenten-Ziffern mit
printf("%e",...)
. So drucken Sie nur 1, und der Umgang mit Visual Studio, standardmäßig druckt mindestens 3 zusätzlicher code benötigt wird.Betrachten IOStreams @Dietmar Kühl
Wenn C++ - code immer noch verwenden will
printf()
Stil-Formate:Einstellen der Wert einer
double
vor dem Aufrufprintf()
zu oft Ergebnisse im Runden Probleme Bereich kurzschließen und Allgemeine Ecke Fall Ausfälle, wie den Umgang mitlog10(0.0)
. Berücksichtigen Sie auch großedouble
nur in der Nähe einer power-of-10, wolog10()
kommen können kurze,-0.0
,INF
,NAN
.In diesem Fall besser zu post-process-string.
Hinweis:
%e
ist liebenswürdig zu post-processing als seine Breite ist nicht so unhandlich wie"%f"
.sprintf(buf, "%f", DBL_MAX)
könnte 1000char
.InformationsquelleAutor chux