سؤال

أتعلم وظائف 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;

يخرجون بنفس القيمة ، فما الذي يتغير حقًا؟

2) كيف يعمل Setw للأرقام السلبية؟

في المثال الأخير من م. والنتيجة هي نفسها بالنسبة لجميع الأمثلة ، ماذا يتغير - تسجيل علامة في setw؟

213565552.0
213565552.0
213565552.0
213565552.0

أين هذه الأرقام تأتي من؟ تختلف قيمة M تمامًا عن تلك المخرجات.

3) هل. في عدد الأرقام في مكان واحد؟

على سبيل المثال ، لدينا رقم 1.23 و setw (10)

سيكون هناك 6 مسافات قبل وبعد ذلك 1.23 (لأن النقطة يتم احتسابها على أنها 1). هل هذا صحيح؟

4) لماذا يتم استخدام setPrecision جنبا إلى جنب مع setw؟ لماذا تظهر 0000s إذا لم يتم استخدامها؟ هل يبدو أن العديد من 0s يمكن أن يتعامل مع تعويم؟

5) لماذا هي قيمة x

213565552.000
 213565552.000
  213565552.000
213565552.000

إذا x = 213565544.4826.

أين تضيع الأرقام 44.4826؟

هل كانت مفيدة؟

المحلول

يبدو أن هذه أسئلة 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. يمكن أن تمثل قيم النقطة العائمة الثنائية قليلة جدًا من الأرقام العشرية (ل float إنه عادة 6 ؛ يمكنك معرفة عدد الأرقام التي يمكن استخدامها بأمان باستخدام std::numeric_limits<float>::digits10). محاولة استخدام أي أرقام أكثر من ذلك قد تؤدي إلى إخراج غير متوقع عند معالجة القيم العشرية (عند معالجة القيم الثنائية التي قد تكون مهتمًا بها std:numeric_limits<float>::digits أماكن). قد ترغب في إلقاء نظرة على ما يجب أن يعرفه كل عالم كمبيوتر عن الحساب العائم.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top