Ответ в теме: Сравнение двух значений (используется для тестирования)

      Комментарии к записи Ответ в теме: Сравнение двух значений (используется для тестирования) отключены

Главная Форумы Программирование Язык Пифагор Примеры Сравнение двух значений (используется для тестирования) Ответ в теме: Сравнение двух значений (используется для тестирования)

#4175

Рассмотренный выше вариант хорошо подходит для сравнения целых чисел, однако, для сравнения дробных чисел необходимо использовать функцию нечеткого сравнения вместо оператора “=”. Код изменится следующим образом:

equals << funcdef X {
  A << X:1;
  B << X:2;
  
  EqOp << [((X:|,3):[<,=]):?]^(=, X:3);

  TypeA << A:type;
  TypeB << B:type;
  [((TypeA, TypeB):[!=, =]):?]^(
    false,
    {
      block {
        [((TypeA, datalist):[!=, =]):?]^(
          {(X:1, X:2):EqOp},
          {X:vec_equals}
        ) >> break
      }
    }
  ):.:. >> return;

}

vec_equals << funcdef X {
  VectorA << X:1;
  VectorB << X:2;

  SizeA << VectorA:|;
  SizeB << VectorB:|;
  [((SizeA, SizeB):[!=,=]):?]^(
    false, 
    {
      block {
        EqOp << [((X:|,3):[<,=]):?]^(=, X:3);
        Ops << (EqOp, SizeA):dup;
        
        Pairs << (VectorA, VectorB, Ops):#:[];
        CountEquals << ((Pairs:equals):?):|; 
        [((CountEquals, SizeA):[!=,=]):?]^(
          false, true
        ) >> break
      }
    }
  ):. >> return;
}

test.equals << funcdef {
  Cases << [
    ("numbers_equal", ((1,1):equals, true)),
    ("numbers_not_equal", ((5,4):equals, false)),
    ("flatten_list_not_equal", (((1,2,3),(4,5,6)):equals, false)),
    ("flatten_list_equal", (((1,2,3),(1,2,3)):equals, true)),
    ("list_structure_not_equal", ((((1,2),3),(1,(2,3)),=):equals, false)),
    ("strings equals", (("hello","hello"):equals, true)),
    ("strings not equals", (("hello","world"):equals, false)),
    ("equals with fuzzy compare", ((1,1.00000001,fuzzy_compare):equals, true)),
    ("not equals with fuzzy compare", ((1,1.001,fuzzy_compare):equals, false)),
    ("equals with fuzzy compare and list structure", (((1.000001,(2)),(1,(2.000001)), fuzzy_compare):equals, true)),
    ("not equals with fuzzy compare and list structure", ((((1.0001,2),3),((1,2),3),fuzzy_compare):equals, false))
  ];

  return << Cases:2:=;
}

В обоих функциях добавился фрагмент, отвечающий за выбор оператора (EqOp). Если аргументов
меньше трех – то по умолчанию берется оператор “=”, иначе берется функция, переданная третьим аргументом. EqOp используется при сравнении двух элементов если они не являются списками данных ({(X:1, X:2):EqOp}). Если же на вход поданы два списка – то сравнению подлежат все их элементы – поэтому оператор сравнения надо скопировать столько раз, сколько есть элементов в списках: Ops << (EqOp, SizeA):dup;.