Junior
Чӣ гуна метавон баробарии ду адади нуқтаи парешон (float) -ро санҷид?
sobes.tech AI
Ҷавоб аз AI
Директӣ муқоиса бо оператори == тавсия дода намешавад, зеро хусусиятҳои намоиш ва гирдошти рақамҳоро дар назар мегирад. Ба ҷои ин, бояд тафтиш кард, ки омили мутлақи фарқият байни рақамҳо дар доираи хурди (epsilon) қарор дорад.
bool are_equal(float a, float b, float epsilon = 0.00001f) {
return std::abs(a - b) < epsilon;
}
Равиши бештар устувор ба хатоии нисбӣ диққат медиҳад, махсусан дар муқоиса кардани рақамҳои хеле калон ё хурд:
#include <cmath>
#include <limits>
bool are_equal_robust(float a, float b, float epsilon = std::numeric_limits<float>::epsilon()) {
// Муқоиса фарқият бо дарназардошти андозаи рақамҳо
// Муҳим аст, ки ҳолатҳои бо сифр ва беинтиҳо алоҳида баррасӣ шаванд
if (a == b) {
return true; // Ҳалли ҳолатҳое, ки a=b (аз ҷумла беинтиҳо ва NaN агар баробар бошанд – ки барои NaN нест, аммо барои беинтиҳо ҳаст)
}
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; // Ҳар ду рақам ба сифр наздиканд
} else {
return absolute_difference / max_abs < epsilon; // Муқоиса фарқияти нисбӣ
}
}
Интихоби epsilon вобаста ба дақиқии зарурӣ ва доираи арзишҳои муқоиса аст. std::numeric_limits<float>::epsilon() нишон медиҳад, ки ками рақам, ки 1.0 + epsilon аз 1.0 фарқ мекунад.
Муҳим аст, ки дар ёд дошта бошед, ки муқоиса бо NaN (Number нест) ҳамеша баргардонидани false аст, аз ҷумла nan == nan. Агар зарур бошад, NaN бояд алоҳида баррасӣ шавад.