Mohssen A Mohssen نشر 1 ديسمبر 2021 أرسل تقرير نشر 1 ديسمبر 2021 عندما أقوم بعمل متغير من نوع 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؟ 1 اقتباس
1 سامح أشرف نشر 1 ديسمبر 2021 أرسل تقرير نشر 1 ديسمبر 2021 يمكنك أن تقوم بعمل دالة تقارن بين رقمين مع فارق بسيط، كالتالي: #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)); } ويمكن أن تستخدمها بنفس الطريقة السابقة أيضًا. 1 اقتباس
0 Wael Aljamal نشر 1 ديسمبر 2021 أرسل تقرير نشر 1 ديسمبر 2021 عند مقارنة أعداد عشرية (فاصلة عائمة) وحساب القيمة المطلقة، يفضل استخدام الدالة 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(); } 2 اقتباس
السؤال
Mohssen A Mohssen
عندما أقوم بعمل متغير من نوع double أو float كالتالي:
عندما أقوم بعمل مقارنة بين المتغير السابق والقيمة 0.3 أحصل على false:
أعلم أن مجموع 0.2 + 0.1 لا يساوي 0.3 بالضبط، ولكن كيف يمكنني أن أقوم بالتحقق من أن القيمة 0.1 + 0.2 تساوي 0.3؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.