Ikki suzuvchi nuqta sonining (float) tengligini qanday tekshirish mumkin?
sobes.tech AI
AIdan javob
To'g'ridan-to'g'ri == operatori bilan solishtirish tavsiya etilmaydi, chunki taqdimot va yaxlitlash xususiyatlari tufayli muammolar yuzaga kelishi mumkin. O'rniga, raqamlar orasidagi farqning mutlaq qiymati kichik bir chegaradan (epsilon) ichida yoki yo'qligini tekshirish kerak.
bool are_equal(float a, float b, float epsilon = 0.00001f) {
return std::abs(a - b) < epsilon;
}
Ko'proq barqaror yondashuv, ayniqsa juda katta yoki juda kichik raqamlarni solishtirganda, nisbiy xatoni hisobga oladi:
#include <cmath>
#include <limits>
bool are_equal_robust(float a, float b, float epsilon = std::numeric_limits<float>::epsilon()) {
// Raqamlarning o'lchamiga qarab farqni solishtirish
// Zero va cheksizlik holatlarini alohida ko'rib chiqish muhim
if (a == b) {
return true; // a=b holatlarini qamrab oladi (cheksizlik va NaN, agar ular bir-biriga teng bo'lsa – NaN uchun emas, lekin cheksizlik uchun)
}
float absolute_difference = std::abs(a - b);
float max_abs = std::max(std::abs(a), std::abs(b));
if (max_abs < epsilon) {
return absolute_difference < epsilon; // Ikkala raqam noldan yaqin
} else {
return absolute_difference / max_abs < epsilon; // Nisbiy farqni solishtirish
}
}
epsilon tanlovi, talab qilinadigan aniqlik va solishtiriladigan qiymatlar diapazoniga bog'liq. std::numeric_limits<float>::epsilon() eng kichik raqamni ifodalaydi, shunda 1.0 + epsilon 1.0dan farq qiladi.
NaN (Not a Number) bilan solishtirish har doim false qaytaradi, jumladan nan == nan ham. Agar NaN bilan ishlash kerak bo'lsa, bu alohida amalga oshirilishi kerak.