Возможно, вы уже видели вот такой пример:
$ perl6 -e'say 0.1 + 0.2 - 0.3' 0
Казалось бы, что здесь такого, но дело в том, что даже в пятом перле результат будет другим:
$ perl -E'say 0.1 + 0.2 - 0.3' 5.55111512312578e-17
Представление чисел с плавающей точкой не давало возможности сделать вычисления без погрешности. В Perl 6 это не так, там получается чистый ноль. Но как?
Что такое 0.1 в Perl 6? Это не число с плавающей точкой, это рациональное число. Иными словами, это объект типа Rat, хранящий два целых числа — числитель и знаменатель.
Берем число и смотрим, что внутри:
my $n = 0.1; say $n.WHAT; # (Rat) say $n.numerator; # 1 say $n.denominator; # 10 say $n.nude; # (1 10)
Метод WHAT возвращает название типа данных — Rat. Методы numerator и denominator показывают числитель и знаменатель, а метод nude (сокращенно от numerator и denominator) возвращает список из двух этих значений.
Как видим, число 0.1 хранится в виде дроби 1/10, поэтому оригинальный тест эквивалентен следующему:
$ perl6 -e'say 1/10 + 2/10 - 3/10' 0
Здесь, кстати, дробь не обозначает деление, вместо этого создается соответствующее рациональное число. Существуют альтернативные записи:
say <1/10>; # 0.1 say ⅒; # 0.1
Любые юникодные дроби, например, ⅔ или ⅝, отлично работают и понимаются перлом.
Еще одна возможность создать рациональное числа — явно вызвать конструктор:
my $r = Rat.new(3, 4); say $r; # 0.75
Перед тем как попрощаться на сегодня, одно важное дополнение. Число с плавающей точкой в Perl 6 представлено типом Num. Чтобы создать такое число, используйте научную запись или явный вызов конструктора:
my $f = 1E-1; say $f.WHAT; # (Num) say $f; # 0.1 my $g = Num.new(0.1); say $g.WHAT; # (Num) say $g; # 0.1
2 thoughts on “8. Рациональные числа в Perl 6”