0

私は setw と setprecision 関数を学んでいるので、これまで試してきたことと、いくつか質問があります。

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

入力は次のとおりです。

      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

だから、今私の質問は:

1) そもそもなぜ「固定」を使うのですか?

この例を見ると:

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

それらは同じ値を出力するので、fixed は実際に何が変わるのでしょうか?

2) setw は負の数に対してどのように機能しますか?

mの最後の例では。結果はすべての例で同じですが、 - 記号は setw で何を変更しますか?

213565552.0
213565552.0
213565552.0
213565552.0

これらの数字はどこから来たのですか?m の値は、出力されたものとはまったく異なります。

3) を行います。は1位と数えますか?

たとえば、番号 1.23 と setw(10) があります。

前に 6 個のスペースがあり、次に 1.23 になります (ドットが 1 としてカウントされるため)。本当?

4) setprecision が setw と一緒に使用されるのはなぜですか? 使用されていないのに 0000 が表示されるのはなぜですか? float が処理できる数の 0 が表示されますか?

5) なぜ x の値は

213565552.000
 213565552.000
  213565552.000
213565552.000

x = 213565544.4826 の場合。

数字 44.4826 はどこで失われますか?

4

1 に答える 1

3

これらは1つではなく5つの質問のようです。ともかく:

  1. std::fixedは、この表記法がより適切な場合に科学表記法を使用するのではなく、常に固定小数点形式を使用することを示すために使用されます。値を合理的に表現するのに多くの桁数が必要な場合、フォーマットは使用を切り替えますx.yyyyyyEee( を使用して、常に科学的フォーマットを使用するように要求できますstd::scientific)。
  2. std::setw()どの値がフォーマットされているかは気にしません! 値がフォーマットされ、正のセットがある場合、出力は少なくとも文字幅になるように文字out.width()でパディングされます。とにかく出力が大きい場合、パディングは発生しません。[これを考慮した]各出力操作の後、は にリセットされます (他のすべての書式設定オプションは自動的にリセットされません)。out.fill()out.width()out.width()out.width()out.width()0
  3. 符号、桁区切り記号、小数点などを含むすべての文字が幅にカウントされます。小数点は精度にはカウントされません。小数点以下のout.precision()桁数 (std::fixed書式設定の場合) または非指数桁数 (std::scientific書式設定の場合) です。 )。
  4. 幅は出力によって埋められる文字数であり、精度は生成される [小数] 桁数を指定します。
  5. 2 進浮動小数点値は、非常に少数の 10 進数を表すことがfloatできます (通常は 6 です。安全に使用できる桁数は を使用して確認できますstd::numeric_limits<float>::digits10)。それよりも多くの桁数を使用しようとすると、10 進数値を処理するときに予期しない出力が発生する可能性があります (2 進数値を処理する場合は、最大桁数に関心がある場合がありますstd:numeric_limits<float>::digits)。What Every Computer Scientist Should Know About Floating-Point Arithmetic をご覧になることをお勧めします。
于 2013-11-07T19:23:11.680 に答える