Нечеткое сравнение чисел

      Комментарии к записи Нечеткое сравнение чисел отключены

Главная Форумы Программирование Язык Пифагор Примеры Нечеткое сравнение чисел

Помечено: 

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 1 неделя, 6 дн. назад.

  • Автор
    Сообщения
  • #4174

    При сравнении двух дробных чисел мы обычно получим false, т.к. в младших разрядах чисел может находиться какой-нибудь “мусор”. Дробные числа необходимо сравнивать с заданной допустимой погрешностью:

    math.is_close << funcdef X {
      A << X:1;
      B << X:2;
      Eps << X:3;
      return << ((A,B):-:math.abs,Eps):<;
    }

    Вычисляется разница двух чисел, полученное значение берется по модулю и сравнивается с допустимой погрешностью.

    Для примера написаны следующие тесты:

    math.test.is_close << funcdef {
      Cases << [
        ("close A > B", ( (123.456, 123.45, 0.1):math.is_close, true):equals),
        ("close A < B", ( (123.45, 123.456, 0.1):math.is_close, true):equals),
        ("not close A > B", ( (123.456, 123, 0.01):math.is_close, false):equals),
        ("not close A < B", ( (123, 124, 0.0001):math.is_close, false):equals)
      ];
      return << Cases;
    }

    Не во всех случаях такая функция окажется удобной, т.к. ее аргументы отличаются от аргументов оператора сравнения (требуется дополнительно передавать допустимую погрешность). Можно определить вспомогательную функцию с фиксированной допустимой погрешностью:

    fuzzy_compare << funcdef X {
      (X:[], 0.000001):math.is_close >> return;
    }

    Тесты:

    test.fuzzy_compare << funcdef {
      Cases << [
        ("int", ( (1, 1):fuzzy_compare, true):equals),
        ("int equal float", ( (1, 1.00000001):fuzzy_compare, true):equals),
        ("int not equal float", ( (1, 1.2):fuzzy_compare, false):equals)
      ];
      return << Cases;
    }

Для ответа в этой теме необходимо авторизоваться.