اذهب إلى المحتوى

السؤال

نشر

عندما أقوم بعمل متغير من نوع double أو float كالتالي:

double x {0.1 + 0.2};	// من المفترض أن القيمة تكون 0.3

عندما أقوم بعمل مقارنة بين المتغير السابق والقيمة 0.3 أحصل على false:
 

if((0.1 + 0.2) == 0.3) {	// false
	std::cout << "equal";
}

أعلم أن مجموع 0.2 + 0.1 لا يساوي 0.3 بالضبط، ولكن كيف يمكنني أن أقوم بالتحقق من أن القيمة 0.1 + 0.2 تساوي 0.3؟

Recommended Posts

  • 1
نشر

يمكنك أن تقوم بعمل دالة تقارن بين رقمين مع فارق بسيط، كالتالي:

#include <cmath>

// epsilon عبارة عن مقدار المقبول الممكن بين المتغيرين
bool isAlmostEqual(double a, double b, double epsilon)
{
    // إذا كان المتغيرين a و b متقاربين كفاية
    return std::abs(a - b) <= epsilon;
}

ويمكن إستخدام هذه الدالة، كالتالي:

double x{ 0.1 + 0.2 };
std::cout << isAlmostEqual(x, 0.3, 0.0001) << '\n';

سيتم طباعة 1 (true) إذا كان الفارق بين القيمتين أقل من أو يساوي 0.0001.

كما يمكن إستخدام دالة أفضل، فبدلًا من الإعتماد على أن يكون المعامل epsilon عبارة عن الفارق بين المتغيرين، يمكن أن نستخدمه على أنه نسبة الفارق بين المتغرين:
 

bool isAlmostEqual(double a, double b, double epsilon)
{
    return (std::abs(a - b) <= (std::max(std::abs(a), std::abs(b)) * epsilon));
}

ويمكن أن تستخدمها بنفس الطريقة السابقة أيضًا.

  • 0
نشر

عند مقارنة أعداد عشرية (فاصلة عائمة) وحساب القيمة المطلقة، يفضل استخدام الدالة fabs أي float absolute لأنها خاصة بالأعداد العشرية،

ويمكننا الحصول على الثابت epsilon بقيمة صغيرة ودقيقة للحسابات من 

std::numeric_limits<double>::epsilon()

 الرياضية من مكتبة limits 

#include <cmath>
#include <limits>

bool AreSame(double x, double y) {
    return std::fabs(x - y) < std::numeric_limits<double>::epsilon();
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...