ফ্লোটিং পয়েন্ট সংখ্যা সরাসরি `==` দিয়ে তুলনা করা ঠিক নয় কারণ রিপ্রেজেন্টেশন এরর থাকে। প্রিসিশন (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;
}
int main() {
float x = 22.0f / 7.0f; // ~3.142857
float y = 3.1415f;
if (compare_float(x, y)) cout << "Equivalent (eps=0.01)" << endl;
else cout << "Not equivalent (eps=0.01)" << endl;
if (compare_float(x, y, 0.001f)) cout << "Equivalent (eps=0.001)" << endl;
else cout << "Not equivalent (eps=0.001)" << endl;
double a = 2.03547415, b = 2.03547428;
if (compare_double(a, b)) cout << "Double equivalent" << endl;
else cout << "Double not equivalent" << endl;
return 0;
}
আউটপুট
Equivalent (eps=0.01) Not equivalent (eps=0.001) Double not equivalent (default eps=1e-9) Double equivalent (eps=1e-6)
উন্নত পদ্ধতি (Relative + Absolute epsilon)
বড় সংখ্যার জন্য আبسোলিউট ইপসিলন কাজ করে না। 상대적인 পার্থক্য (relative difference) ব্যবহার করুন:
bool approx_equal(double a, double b, double eps = 1e-9) {
return fabs(a - b) <= eps * fmax(fabs(a), fabs(b));
}
C++20: std::cmp_equal, std::cmp_less ইত্যাদি (header `