سؤال

كيف يمكنني القيام بالرياضيات التي تنطوي على أرقام مهمة في C ++؟ أريد أن يعمل هذا بشكل صحيح مع البيانات المقاسة من تجارب الكيمياء والفيزياء. مثال: 65/5 = 10. سأحتاج إلى التخلص من الأماكن العشرية غير الضرورية واستبدال بعض الأرقام بـ 0s.

شكرًا!

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

المحلول

حسنا هناك مكتبات الرياضيات الجيدة في الرياضيات

كما أن تخزين أرقامك في العوامات أو الزوجي أو الزوجي الطويل سيسمح بعمليات أكثر دقة.

تقدم العوامات 7 أرقام مهمة بينما توفر الزوجي 16 رقمًا مهمًا.

مصدر

أيضًا عند الطباعة عادةً ، يستخدم الأشخاص _snprintf أو printf ويمكنك تنسيق تلك الزوجي ، ويعتزم على الدقة التي تريدها مثل:

تعويم الدقة

printf ("value ٪ 8.2f" ، floataBhible) ؛

هذا يقول أنك تحتاج إلى حقل إجمالي مكون من 8 أحرف ، ضمن الأحرف الثمانية ، سيحمل آخر 2 الجزء العشري.

_snprintf (Buffer ، sizeof (Buffer) ، "value ٪ .2f" ، floataLable) ؛

يطلب المثال أعلاه الحد الأدنى لعرض الحقل والشرفتين الأخيرتين للاحتفاظ بالجزء العشري.

نصائح أخرى

يجب أن يحصل هذا على ما تحتاجه:

std::cout.precision(x); // x would be the number of significant figures to output

قد لا تكون هذه هي الطريقة الأكثر فعالية ، ولكن يمكنك إنشاء نوع بيانات SIG FIG مخصص.

class SigFigFloat
{
  SigFigFloat(vector<short> digits, int decimalIndex, bool negative);
  SigFigFloat operator+(const SigFigFloat &value);
  SigFigFloat operator-(const SigFigFloat &value);
  //etc...


}

يمكن أن يكون الكثير من العمل ، ولكن إذا قمت بتطبيق هذا بشكل صحيح ، فقد يكون ذلك وسيلة مرنة حقًا لتمثيل الحسابات والقيام باستخدام SIG Figs.

إنه أمر صعب لأن الشخصيات المهمة هي مفهوم عشري ، وأجهزة الكمبيوتر تتحدث الثنائية. يمكنك استخدام فئات الأرقام العشرية (لا أعرف أي شيء) ، أو استخدام تعزيز :: الفاصل, ، وهو الأقرب إلى ما تريد بالتأكيد تحقيقه.

هذا يعتمد على كيفية عرضك. إذا كنت تستخدم عائلة printf ، فأنت تقوم بتعيين الدقة (sprintf(buffer, "%.2f", myfloat)). إذا كنت تستخدم Ostreams ، فأنت تتصل بوظيفة الدقة لتعيين عدد الأماكن العشرية. إذا كنت تبحث عن الطريقة الأكثر علمية لـ SIG Figs ، فسيتعين عليك كتابة وظيفة مخصصة تحدد الدقة بناءً على القيمة الحالية للعائمة.

إليك حل سريع C ++ 11 الذي عمل بالنسبة لي:

int sig_figs = 3;
double number = 1562.654478;

std::cout << "original number:" << number << std::endl;

number = ([number](int number_of_sig_figs)->double{
    std::stringstream lStream;
    lStream << std::setprecision(number_of_sig_figs) << number;
    return std::stod(lStream.str());
})(sig_figs);

std::cout << "rounded number:" << number << std::endl;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top