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

C/C++-এ float/double তুলনার সবচেYe কার্যকর পদ্ধতি

ফ্লোটিং পয়েন্ট (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 ছোট মানের জন্যই ঠিক।

  1. C++ এবং Go প্রোগ্রামিং ভাষার পার্থক্য

  2. সমদ্বিবাহু ত্রিভুজের উচ্চতা এবং ক্ষেত্রফল (C++)

  3. C++-এ কিউবয়েডের ভলিউম এবং সারফেস এরিয়া বের করার প্রোগ্রাম

  4. সাইফারপাঙ্করা কারা এবং তারা কী পক্ষে হস্তক্ষেপ করছেন?