8. Рациональные числа в Perl 6

Возможно, вы уже видели вот такой пример:

$ 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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s