сравнение операторы сравнения, отношения

## Синтаксис

                a==b
                a~=b или a<>b
                a<b
                a<=b
                a>b
                a>=b

## Аргументы

a

  любой тип переменной для сравнения величин `a==b`, `a~=b` `a<>b`, но для сравнений, связанных с порядком `a<b`, `a<=b`, `a>b`, `a>=b`, ограничен массивами вещественных чисел с плавающей запятой и массивами целочисленных значений.

b

  любой тип переменной для сравнения величин `a==b`, `a~=b` `a<>b`, но для сравнений, связанных с порядком `a<b`, `a<=b`, `a>b`, `a>=b`, ограничен массивами вещественных чисел с плавающей запятой и массивами целочисленных значений.

## Описание

Нужно различать два класса операторов:

сравнение на равенство и неравенство:

  `a==b`, `a~=b` (или по-другому `a<>b`). Эти операторы применимы к любому типу операндов.

Сравнения, связанные с порядком:

  `a<b`, `a<=b`, `a>b`, `a>=b`. Эти операторы применимы только к массивам чисел с плавающей запятой и целочисленным массивам.

Смысл операторов сравнения также зависит от типа операндов:

Для массивов переменных

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

  - Если `a` и `b` являются массивами одного типа и размера, то сравнение выполняется поэлементно, а результат является массивом логических значений того же размера.

  - Если `a` и `b` являются массивами одного типа, но `a` или `b` является скаляром, то скаляр сравнивается с каждым элементом массива. Результат является массивом логических значений того же размера, что и оператор-нескаляр.

  - В иных случаях результатом является логическое значение `%f`

  - Если типы данных операндов отличаются, но "совместимы" как числа с плавающей запятой и целые числа, то перед сравнение производится преобразование типов.

Для других типов операндов

  таких как `function` и `libraries` результатом является `%t`, если объекты идентичны и `%f` в противном случае.

  Сравнение на равенство операндов несовместимых типов данных возвращает `%f`.

- Полиномы: `%s==%z` возвращает `%F` : Два полинома не могут считаться равными, если они не относятся к одной и той же переменной.

- Рациональные числа: `1/%s == 1/%z` возвращает `%F` : Два рациональных числа не могут быть равными если они не относятся к одной и той же переменной. Кроме того, одно и тоже рациональное число может иметь различные ненормированные формы, которые не могут считаться равными. Например, `2/(2*%z) == 1/%z` возвращат `%F`, даже в режиме упрощения `simp_mode(%T)`.

- Разрежённая числовая матрица: любое поэлементное сравнение с полным числовым массивом всегда возвращает разрежённый массив логических значений. См. примеры.

- Графические идентификаторы: графический дескриптор `h1` и его копия `h2=h1` всегда будут равными, даже если графические окна меняются с помощью одного из них. См. примеры.

## Примеры

    // поэлементные сравнения
    (1:5)==3
    (1:5)<=4
    (1:5)<=[1 4 2 3 0]
    1<[]
    list(1,2,3)~=list(1,3,3)
    "foo"=="bar"
    sparse([1,2;4,5;3,10],[1,2,3]) == sparse([1,2;4,5;3,10],[1,2,3])

    //пообъектные сравнения
    (1:10)==[4,3]
    'foo'==3
    1==[]
    list(1,2,3)==1

    isequal(list(1,2,3),1)
    isequal(1:10,1)

Сравнения с явным преобразованием типов или кодирования:

    int32(1) == 1
    int32(1) < 1.5
    int32(1:5) < int8(3)
    1 == complex(1,0)
    1 > complex(1,0)  // по-прежнему OK, однако...
    1 > complex(1,1)  // => ошибка: комплексные числа не упорядочены

    --> int32(1) == 1
     ans  =
      T

    --> int32(1) < 1.5
     ans  =
      T

    --> int32(1:5) < int8(3)
     ans  =
      T T F F F

    --> 1 == complex(1,0)
     ans  =
      T

    --> 1 > complex(1,0)  // по-прежнему OK, однако...
     ans  =
      F

    --> 1 > complex(1,1)  // => ошибка: комплексные числа не упорядочены
    at line    11 of function %s_2_s ( SCI\modules\overloading\macros\%s_2_s.sci line 23 )
    Комплексные числа не поддерживаются. Пожалуйста, определите %s_2_s_custom() или проверьте свой код.

Сравнения с полиномами и рациональными числами:

    p = 0*%s
    p == 0
    r = p/(1+0*%s)
    r == 0
    r == p
    ps = (1-%s)^2, pz = (1-%z)^2
    ps == pz  // => %F : требуются одни и те же переменные

    --> p = 0*%s
     p  =
       0

    --> p == 0
     ans  =
      T

    --> r = p/(1+0*%s)
     r  =
       0
       --
       1

    --> r == 0
     ans  =
      T

    --> r == p
     ans  =
      T

    --> ps = (1-%s)^2, pz = (1-%z)^2
     ps  =
                 2
       1  -2s +s
     pz  =
                 2
       1  -2z +z

    --> ps == pz  // => %F : требуются одни и те же переменные
     ans  =
      F

Сравнения с разрежёнными числовыми матрицами: все поэлементные сравнения выдают разрежённый результат, в противном случае `%F`.

    sp = sparse([0 1 0 0 -2 0 4 0 0])
    sp < 0
    sp == 1
    sp >=       [2 3 -1 2 -4 0 3 1 0]
    sp == %i
    sp == list(3) // => %F

    --> sp = sparse([0 1 0 0 -2 0 4 0 0])
     sp  =
    (  1,  9) sparse matrix
    (  1,  2)     1.
    (  1,  5)    -2.
    (  1,  7)     4.

    --> sp < 0
     ans  =
    (  1,  9) sparse matrix
    (  1,  5)   T

    --> sp == 1
     ans  =
    (  1,  9) sparse matrix
    (  1,  2)   T

    --> sp >= [2 3 -1 2 -4 0 3 1 0]
     ans  =
    (  1,  9) sparse matrix
    (  1,  3)   T
    (  1,  5)   T
    (  1,  6)   T
    (  1,  7)   T
    (  1,  9)   T

    --> sp == %i
     ans  =
    (  1,  9)False sparse matrix

    --> sp == list(3)  // сравнение объектов => сжатая %F
     ans  =
      F

Сравнения между графическими идентификаторами:

    plot2d()
    e1 = gce();
    e2 = e1;    // точки e1 и e2 на оодном и томже графическом объекте
    e2.tag
    e1.tag = "3 curves";
    e1 == e2
    e2.tag

    --> e2.tag
     ans  =

    --> e1.tag = "3 curves";
    --> e1 == e2
     ans  =
      T

    --> e2.tag
     ans  =
     3 curves

Возможны сравнения псевдонимов функций:

    sine = sin ;
    sine == sin
    синус = sind ;
    синус == sind
    синус(0:90:360)

    --> sine = sin ;
    --> sine == sin
     ans  =
      T

    --> синус = sind ;
    --> синус == sind
     ans  =
      T

    --> синус(0:90:360)
     ans  =
       0.   1.   0.  -1.   0.

## Смотрите также

- меньше
- больше
- boolean
- isequal

## История

6.0

- `~` (отрицание) сейчас имеет приоритет выше, чем у операций сравнения (`== ~= < <= >= >`).
- Комплексные числа с нулевой мнимой частью теперь сравниваются как вещественные числа.