Re: Сравнение float
От: Кодт Россия  
Дата: 19.02.02 16:36
Оценка:
Здравствуйте 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
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.