Рациональные числа в Раку - PullRequest
8 голосов
/ 28 марта 2020

Я использую Raku для некоторых вычислений, потому что он имеет хорошие числа c типов. Однако у меня есть проблема с использованием '.raku'

say (1/6+1/6).raku
#<1/3>

Мы получили это. Тем не менее,

say (1/10+1/10).raku
#0.2

Это ошибка? Я ожидал <1/5>. Что происходит?

Ответы [ 2 ]

11 голосов
/ 28 марта 2020

В Raku 0.2 создает Rat и, таким образом, дает тот же результат, что и запись 1/5 (которая будет постоянно сложена) или <1/5> (буквальная форма). Вы можете получить число с плавающей запятой только в случае указания показателя (например, 2e-1).

Работа метода .raku (ранее известного как .perl) заключается в создании чего-то, что будет выполнять обход и произвести то же значение, если EVAL 'd. В случае 1/5 это может быть точно представлено в виде десятичной дроби, поэтому оно будет выдавать 0.2. Он прибегает к дробному представлению только тогда, когда десятичная форма не будет встречаться в обратном порядке.

Вы всегда можете восстановить числитель и знаменатель, используя методы .numerator и .denominator для форматирования при использовании wi sh. Кроме того, метод .nude возвращает список числителя и знаменателя, к которому можно присоединиться с помощью /, если требуется:

say (1/6+1/6).nude.join("/");     # 1/3
say (1/10+1/10).nude.join("/");   # 1/5
1 голос
/ 28 марта 2020

Hi @ milou123 Я также был немного удивлен, что raku возвращается к десятичному представлению - я вижу, что некоторые контексты, такие как обучение дробной арифметике c, выиграют от использования режима "держать как крыса". Сказав это, в конечном счете, имеет смысл, что есть только один способ .raku что-то и это десятичное представление по умолчанию.

Конечно, с помощью raku вы также можете просто немного изменить язык. В этом случае я изобрел новый постфиксный оператор '→' ...

multi postfix:<→> ( Rat:D $r ) { $r.nude.join("/") }
say (1/5+1/5)→;    # 2/5

Я недостаточно умен, чтобы понять, можно ли аналогичным образом переопределить встроенный метод 'raku', хотел бы получить совет о том, как сделать это кратко ...

...