Equal
относится к семантическому равенству, тогда как SameQ
- синтаксическое равенство.Например, Sin[x]^2+Cos[x]^2
и 1
- это одно и то же число, поэтому они семантически равны.Поскольку это невозможно определить без дополнительных преобразований, Equal
возвращает значение без оценки.Однако фактические выражения различны, поэтому SameQ
дает False
.
Sin[x]^2 + Cos[x]^2 == 1
Sin[x]^2 + Cos[x]^2 === 1
Simplify[Sin[x]^2 + Cos[x]^2 == 1]
Обратите внимание, что существует специальная обработка чисел Real
, SameQ[a,b]
может возвращать True
, если a
и b
отличаются последней двоичной цифрой.Чтобы выполнить более ограничительное тестирование идентичности, используйте Order[a,b]==0
a = 1. + 2^-52;
b = 1.;
a === b
Order[a, b]==0
SameQ
и может возвращать True
для выражений, которые синтаксически отличаются, поскольку заголовки выражений могут автоматически сортировать аргументы.Вы можете предотвратить автоматическую сортировку, используя атрибуты хранения.Например
c + d === d + c
SetAttributes[SameQ, HoldAll]
c + d === d + c