Здравствуйте Yuri, Вы писали:
Y>Привет всем!
Y>Есть два числа типа float,
Y>одно содержит 0.50000002607703
Y>другое — 0.50000000000000
Y>Как мне их сравнить, так чтобы в сравнении участвовали только две цифры после запятой
Округлить ;)
1) округление до 0.01
inline double round_to(double value, double eps)
{
assert(eps > 0);
return floor(value/eps + 0.5) * eps;
}
inline int compare_1(double a, double b, double eps)
{
double diff = floor(a/eps + 0.5) - floor(b/eps + 0.5);
return diff < 0 ? -1 : diff > 0 ? +1 : 0;
}
compare_1(0.5123, 0.5145, 0.01);
diff = floor(51.23 + 0.5) - floor(51.45 + 0.5) == 51-51 = 0
2) числа в окрестности +/- 1% считать равными
inline double compare_2(double a, double b, double eps)
{
double diff = round_to( (a - b) * 2 / (a + b), eps);
return diff < 0 ? -1 : diff > 0 ? +1 : 0;
}
compare_2(0.000512, 0.000534, 0.01)
diff = round_to( -0.000022 / 0.000522, 0.01 )
= round_to( -0.0421..., 0.01 )
= -0.04
compare_2(0.0005123, 0.0005145, 0.01)
diff = round_to( -0.0000022 / 0.0005122, 0.01 )
= round_to( -0.00429..., 0.01 )
= 0