Domanda

Sto imparando le funzioni setw e setprecision, quindi ecco cosa ho provato finora e ho alcune domande.

#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;
}

E l'input è:

      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

Quindi, ora le mie domande sono:

1) Perché usiamo "fisso" in primo luogo?

Se guardiamo questo esempio:

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

Restituiscono lo stesso valore, quindi cosa cambia veramente fisso?

2) Come funziona setw per i numeri negativi?

Nell'ultimo esempio di m.Il risultato è lo stesso per tutti gli esempi, cosa cambia il segno - nel setw ?

213565552.0
213565552.0
213565552.0
213565552.0

Da dove vengono questi numeri?Il valore di m è totalmente diverso da quelli emessi.

3) Il file .nel numero conta come 1 posto?

Ad esempio, abbiamo il numero 1.23 e setw(10)

Ci sarebbero 6 spazi prima e poi 1,23 (perché il punto viene contato come 1).È vero?

4) Perché setprecision viene utilizzato insieme a setw?Perché appaiono 0000 se non vengono utilizzati?Appaiono tanti 0 quanti il ​​float può gestire?

5) Perché il valore di x

213565552.000
 213565552.000
  213565552.000
213565552.000

Se x = 213565544.4826.

Dove si perdono i numeri 44.4826?

È stato utile?

Soluzione

Sembrano essere 5 domande anziché una.Comunque:

  1. std::fixed viene utilizzato per indicare che si desidera avere sempre un formato a virgola fissa anziché utilizzare la notazione scientifica laddove questa notazione è più appropriata.Quando sono necessarie molte cifre per rappresentare ragionevolmente il valore, il formato cambierà utilizzo x.yyyyyyEee (potete chiedere di utilizzare sempre il formato scientifico utilizzando std::scientific).
  2. std::setw() non importa quale valore è formattato!Quando un valore è formattato e c'è un positivo out.width() impostato, l'output verrà riempito con out.fill() carattere per essere almeno out.width() caratteri larghi.Se l'output è maggiore di out.width() in ogni caso non si verificherà alcuna imbottitura.Dopo ogni operazione di output [che richiede out.width() in considerazione] il out.width() viene reimpostato su 0 (tutte le altre opzioni di formattazione non vengono ripristinate automaticamente).
  3. Qualsiasi carattere conta ai fini della larghezza, inclusi il segno, i separatori delle migliaia, i punti decimali, ecc.Il punto decimale non conta ai fini della precisione: out.precision() è il numero di cifre frazionarie (per std::fixed formattazione) o il numero di cifre non esponenti (per std::scientific formattazione).
  4. La larghezza indica quanti caratteri verranno riempiti dall'output, la precisione specifica quante cifre [frazionarie] devono essere prodotte.
  5. I valori binari in virgola mobile possono rappresentare pochissime cifre decimali (ad es float normalmente sono le 6;puoi scoprire quante cifre possono essere utilizzate in sicurezza utilizzando std::numeric_limits<float>::digits10).Cercare di utilizzare più cifre probabilmente darà come risultato un output inaspettato durante l'elaborazione di valori decimali (durante l'elaborazione di valori binari potresti essere interessato fino a std:numeric_limits<float>::digits luoghi).Potresti voler dare un'occhiata Ciò che ogni informatico dovrebbe sapere sull'aritmetica in virgola mobile.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top