Ich kann nicht glauben, dass ich nicht weiß, wie ich das machen soll, aber was soll ich sagen, ich weiß es nicht. Ich versuche nur, die Zahlen in Standard Format (im Gegensatz zur wissenschaftlichen Notation).
Ich habe zahllose Beispiele gelesen, wie man dies mit "setprecision(...)" und "fixed" und so weiter erreichen kann, aber das Problem ist, dass die Genauigkeit der Zahlen zur Kompilierzeit nicht bekannt ist und die Eingabe einer konservativen Schätzung mit "setprecision(...)" haufenweise überflüssige Nullen an der Stelle hinterlässt.
Hier ist ein Beispiel für das, was ich suche:
let: tau = 6.2831
tau * 0.000001 -> 0.0000062831
tau * 0.001 -> 0.0062831
tau -> 6.2831
tau * 1000 -> 6283.1
tau * 1000000 -> 6283100
Im Moment bekomme ich:
tau * 0.000001 -> 6.2831e-006
tau * 0.001 -> 0.0062831
tau -> 6.2831
tau * 1000 -> 6283.1
tau * 1000000 -> 6.2831e+006
Das einzige, was ich tun kann, ist, irgendwie extrahieren Sie den Exponenten der doppelten dann, wenn der Exponent positiv ist "fix" die Präzision auf Null, andernfalls setzen Sie die Präzision auf "-1 * exp"; aber dies scheint wie eine extrem verworrene Weise zu "ausschalten" wissenschaftliche Notation. Kennt jemand einen besseren Weg?
1 Stimmen
Sie bekämen offensichtlich Probleme mit z.B.
tau * 1e-80
Das ist wahrscheinlich der Grund, warum es keine einfache Lösung gibt. - Übrigens, was hat es mittau * 1000000 -> 6.2831e-006
?1 Stimmen
Das Problem ist, dass die meisten Dezimalbrüche nicht genau durch eine binäre Fließkommazahl dargestellt werden können (die so gut wie jede C++-Implementierung für ihre eingebauten Fließkommatypen verwendet). Wenn ich zum Beispiel auf meinem Computer definiere
float tau = 6.2831
dann ist der tatsächliche Wert6.283100128173828125
. Der Formatierer kann nicht wissen, dass die letzten 14 Ziffern auf einen Rundungsfehler zurückzuführen sind.0 Stimmen
Tatsächlich ist es sogar so, dass es könnte vertreten
6.2831
genau, dann wäre es immer noch gleich6.28310
. Es gibt keine "überflüssigen Nullen" in einer Darstellung mit fester Größe. Wenn Sie unterscheiden wollen zwischen6.2831
y6.28310
müssen Sie Folgendes verwendenstd::string
.0 Stimmen
Ups, ich hatte "-006", obwohl ich "+006" meinte. Das tut mir leid.
0 Stimmen
Die Erweiterung von "tau * 1e-80" kann durchaus ein Problem darstellen, aber ich kann Ihnen versichern, dass dies weniger Probleme verursacht als das Schreiben von "...e+80", da der Parser, der die Ausgabe konsumiert, jedes Mal, wenn er auf ein "e" stößt, einen großen Wackler macht. Soweit ich weiß, wird er 0.0000...001 problemlos parsen.