Frage

Ich lerne die SetW- und SetPrecision -Funktionen. Hier ist also, was ich bisher versucht habe und ich habe ein paar Fragen.

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    float y = 1.25;

    cout << fixed << setw(10) << setprecision(2) << y << endl;

    cout << "\n\n\nx\n";

    float x = 213565544.4826;
    cout << fixed << setw(13) << setprecision(3) << x << endl;
    cout << fixed << setw(14) << setprecision(3) << x << endl;
    cout << fixed << setw(15) << setprecision(3) << x << endl;
    cout << fixed << setprecision(3) << x;

    cout << "\n\n\nz\n";

    float z = 213565544.4826;
    cout << setw(11) << setprecision(1) << x << endl;
    cout << fixed << setw(12) << setprecision(1) << x << endl;
    cout << fixed << setw(11) << setprecision(1) << x << endl;
    cout << setw(12) << setprecision(1) << x << endl;

    cout << "\n\n\nm\n";

    float m = -344.275;
    cout << fixed << setprecision(1) << x << endl;
    cout << fixed << setw(8) << setprecision(1) << x << endl;
    cout << fixed << setw(7) << setprecision(1) << x << endl;
    cout << fixed << setw(6) << setprecision(1) << x << endl;

    return 0;
}

Und die Eingabe ist:

      1.25



x
213565552.000
 213565552.000
  213565552.000
213565552.000


z
213565552.0
 213565552.0
213565552.0
 213565552.0



m
213565552.0
213565552.0
213565552.0
213565552.0

Also, jetzt sind meine Fragen:

1) Warum verwenden wir "Fix" an erster Stelle?

Wenn wir uns dieses Beispiel ansehen:

cout << setw(11) << setprecision(1) << x << endl;
cout << fixed << setw(11) << setprecision(1) << x << endl;

Sie geben den gleichen Wert aus. Was ändert sich das Fixieren also wirklich?

2) Wie funktioniert SETW für negative Zahlen?

Im letzten Beispiel von m. Das Ergebnis ist für alle Beispiele dasselbe. Was ändert sich das Zeichen in der SETW?

213565552.0
213565552.0
213565552.0
213565552.0

Woher kommen diese Zahlen? Der Wert von m unterscheidet sich völlig von den ausgegebenen.

3) macht das. In der Zahl zählt ein Platz?

Zum Beispiel haben wir Nummer 1.23 und SETW (10)

Es würde 6 Plätze vor und dann 1,23 geben (weil der Punkt als 1 gezählt wird). Ist das wahr?

4) Warum wird SetPrecision zusammen mit SETW verwendet? Warum erscheinen 0000s, wenn es nicht verwendet wird? Erscheint es so viele 0, wie der Schwimmer verarbeiten kann?

5) Warum ist der Wert für x

213565552.000
 213565552.000
  213565552.000
213565552.000

Wenn x = 213565544.4826.

Wo gehen die Zahlen 44.4826 verloren?

War es hilfreich?

Lösung

Dies scheinen eher 5 Fragen als eines zu sein. Wie auch immer:

  1. std::fixed wird verwendet, um anzuzeigen, dass Sie immer ein Fixpunktformat haben möchten, anstatt wissenschaftliche Notation zu verwenden, bei der diese Notation angemessener ist. Wenn es viele Ziffern benötigt, um den Wert angemessen darzustellen, wechselt das Format die Verwendung x.yyyyyyEee (Sie können bitten, immer ein wissenschaftliches Format verwenden std::scientific).
  2. std::setw() Es ist egal, welcher Wert formatiert ist! Wenn ein Wert formatiert ist und es positiv ist out.width() Setzen Sie, der Ausgang wird mit gepolstert out.fill() Charakter zumindest sein out.width() Charaktere breit. Wenn die Ausgabe größer ist als out.width() Wie auch immer, es tritt keine Polsterung auf. Nach jedem Ausgangsvorgang [die dauert out.width() berücksichtigen] die out.width() wird zurückgesetzt auf 0 (Alle anderen Formatierungsoptionen werden nicht automatisch zurückgesetzt).
  3. Jeder Charakter zählt in Richtung der Breite, einschließlich des Zeichens, Tausenden -Separatoren, Dezimalpunkte usw. Der Dezimalpunkt zählt nicht zur Präzision: out.precision() ist die Anzahl der fraktionalen Ziffern (für std::fixed Formatierung) oder die Anzahl der Nicht-Exponent-Ziffern (für std::scientific Formatierung).
  4. Die Breite ist, wie viele Zeichen durch die Ausgabe gefüllt werden. Die Genauigkeit gibt an, wie viele [fraktionale] Ziffern erzeugt werden sollen.
  5. Binäre schwimmende Punktwerte können nur sehr wenige Dezimalstellen darstellen (für float es ist normalerweise 6; Sie können herausfinden, wie viele Ziffern durch Verwendung sicher verwendet werden können std::numeric_limits<float>::digits10). Der Versuch, mehr Ziffern als diese zu verwenden std:numeric_limits<float>::digits setzt). Vielleicht möchten Sie einen Blick sehen Was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top