ফ্লোটিং পয়েন্ট (float/double) সংখ্যা সরাসরি == দিয়ে তুলনা করা ভুল, কারণ বাইনারি রিপ্রেজেন্টেশন একজাক্ট নয়। প্রিসিশন (epsilon) ব্যবহার করে আبسোলিউট বা রিলেটিভ ডিফারেন্স চেক করতে হয়।
বেসিক epsilon তুলনা
#include <iostream>
#include <cmath>
using namespace std;
bool compare_float(float x, float y, float epsilon = 0.01f) {
return fabs(x - y) < epsilon;
}
bool compare_double(double x, double y, double epsilon = 1e-9) {
return fabs(x - y) < epsilon;
}
উদাহরণ আউটপুট
float: 22/7 vs 3.1415 -> Equivalent (eps=0.01), Not equivalent (eps=0.001) double: 2.03547415 vs 2.03547428 -> Not equivalent (eps=1e-9), Equivalent (eps=1e-6)
উন্নত পদ্ধতি: Relative Epsilon (ULP-based)
বড় মানের সংখ্যার জন্য ফিক্সড epsilon কাজ করে না। আপেক্ষিক পার্থক্য (relative difference) ব্যবহার করুন:
bool approx_equal(double a, double b, double max_rel_diff = 1e-9) {
double diff = fabs(a - b);
double largest = max(fabs(a), fabs(b));
return diff <= largest * max_rel_diff;
}
// অথবা ULP (Units in Last Place) বেসড - সবচেYe সঠিক
#include <cmath>
#include <limits>
bool almost_equal_ulp(double a, double b, int max_ulp = 4) {
if (a == b) return true;
if (isnan(a) || isnan(b)) return false;
double diff = fabs(a - b);
double norm = fmin(fabs(a) + fabs(b), numeric_limits::max());
return diff <= numeric_limits::epsilon() * norm * max_ulp;
}
C++20: std::cmp_* ফাংশন
#include <compare> // বা? // C++20 এ std::cmp_equal, std::cmp_less, std::cmp_greater ইত্যাদি // NaN সেফ, সাইনড জিরো হ্যান্ডলিং সঠিক if (std::cmp_equal(a, b)) { ... }
সারসংক্ষেপ: সাধারণ কাজের জন্য relative epsilon (1e-9 for double), ক্রিটিক্যাল কাজের জন্য ULP-based বা C++20 std::cmp_equal। fabs(a-b) < epsilon ছোট মানের জন্যই ঠিক।