7 Stimmen

Wie kann die Breite des Exponentenfeldes für einen Ostream festgelegt werden?

Dieser Code:

#include <iostream>
int main( int, char **argv )
{
std::cout << 1.23e45 << std::endl;
}

druckt

1.23e+045

wenn sie mit MS Visual Studio 2003 kompiliert werden, und

1.23e+45

auf meinem Linux-Rechner.

Wie kann ich die Breite des Exponentenfeldes angeben (und warum gibt es überhaupt einen Unterschied)?

1voto

Pieter Punkte 16973

Ich glaube nicht, dass dies mit herkömmlichen Manipulatoren möglich ist. (wenn es ist, würde ich gerne korrigiert werden und lernen, wie)

Die einzige verbleibende Möglichkeit besteht darin, selbst einen Streambuf zu erstellen und alle Exponenten-Zahlen abzufangen, die an den Stream gehen, sie von Hand umzuformatieren und an den zugrunde liegenden Stream weiterzuleiten.

Das scheint eine Menge Arbeit zu sein, und obwohl es keine Raketenwissenschaft ist, ist es auch keine triviale Aufgabe.

Zur Frage nach dem "Warum": Ich weiß, dass Linux den Exponenten mit mindestens zwei Ziffern definiert, ich nehme an, dass Windows ihn mit mindestens drei Ziffern spezifiziert?

// on linux
std::cout << std::scientific << 1.23e4 << std::endl

Außerdem wird eine führende Null hinzugefügt:

1.230000e+04

1voto

xtofl Punkte 39285

Im Anschluss an die Antwort von @Pieter habe ich mir den Operator<< (ostream&, double) angesehen. Es gibt in der Tat kein Feld, um die Bedeutung oder Breite des Exponenten anzugeben. Unter Windows leitet der Operator<< an sprintf weiter, das ebenfalls keine Exponentengröße hat.

Die Funktion sprintf (unter Windows) ruft ihrerseits _cfltcvt_l auf, eine Funktion, für die wir keinen Quellcode haben, deren Signatur aber keine Exponentenpräzision vorsieht.

Ich weiß nichts über die Implementierung unter Linux.

-1voto

xtofl Punkte 39285

Sehen Sie sich den iomanip-Header an. Es hat eine Menge von Breite-Präzision etc... Funktionalität.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X