В Perl 6 есть оператор приблизительного равенства (approximately-equal operator). Он существует в двух формах — ASCII =~= и юникодном ≅.
Оператор возвращает истину, если относительная разность между операндами меньше величины $*TOLERANCE, которая по умолчанию равна 10–15.
say 3.14159265358979323 =~= pi; # True say 3.14 =~= pi; # False
Допуск хранится в переменной с динамической областью видимости, поэтому ее можно изменять, если потребуется сравнение с другой точностью:
{ my $*TOLERANCE = 0.1; say pi =~= 3.14; # True }
Пара слов о работе оператора. Если оба операнда отличны от нуля, происходит такое сравнение:
|$a - $b| / max(|$a|, |$b|) < $*TOLERANCE
(Здесь |$a| — абсолютное значение величины.)
Если же один из операндов — ноль, то в этом случае возвращается результат сравнения абсолютной величины второго операнда с нулем. То есть в этом случае второй операнд не должен превышать по модулю 10–15:
say 1E-14 =~= 0; # False say 1E-16 =~= 0; # True