কম্পিউটার টিউটোরিয়াল

C++-এ ফ্লোটিং পয়েন্ট তুলনা (Precision-aware)

ফ্লোটিং পয়েন্ট সংখ্যা সরাসরি `==` দিয়ে তুলনা করা ঠিক নয় কারণ রিপ্রেজেন্টেশন এরর থাকে। প্রিসিশন (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 ``/``) নিরাপদ ফ্লোটিং পয়েন্ট তুলনার জন্য উপলব্ধ।

  1. C++-এ অ্যারেতে পার্টিশন পয়েন্ট বের করা

  2. C++-এ ফ্লোটিং পয়েন্ট সংখ্যার GCD বের করার প্রোগ্রাম

  3. C++-এ কমপ্লেক্স নম্বর দিয়ে জ্যামিতি (Geometry using Complex Numbers)

  4. C++-এ একটি পয়েন্টকে অন্য পয়েন্টের সাপেক্ষে ঘুরানো (Rotation)