Números racionais em Raku

8

Estou usando o Raku para alguns cálculos, porque possui bons tipos numéricos. No entanto, tenho um problema ao usar '.raku'

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

Nós obtemos isso. Contudo,

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

Isso é um bug? Eu esperava <1/5>. O que acontece?

milou123
fonte
Removida a tag perl, pois isso não pertence à linguagem de programação Perl.
ikegami 28/03

Respostas:

11

Em Raku, 0.2constrói a Rate, portanto, produz o mesmo resultado que a escrita 1/5(que será dobrada constantemente) ou <1/5>(a forma literal). Você só obtém ponto flutuante no caso de especificar um expoente (por exemplo, 2e-1).

O trabalho do método .raku(anteriormente conhecido como .perl) é produzir algo que irá percorrer e produzir o mesmo valor se EVAL'd. No caso de 1/5, isso pode ser representado exatamente como um decimal, portanto será produzido 0.2. Ele apenas recorre à representação fracionária quando uma forma decimal não ida e volta.

Você sempre pode recuperar o numerador e o denominador usando os métodos .numeratore .denominatorpara formatar como desejar. Além disso, o .nudemétodo retorna uma lista do numerador e denominador, ao qual se pode juntar um /se desejado:

say (1/6+1/6).nude.join("/");     # 1/3
say (1/10+1/10).nude.join("/");   # 1/5
Jonathan Worthington
fonte
.nudemelhor nome do método engraçado sem querer
user0721090601 28/03
1
Quem disse que não foi intencional?
Holli 28/03
1
@ user0721090601 Com base em como Larry o mencionou em entrevistas, eu apostaria que isso era intencional.
Brad Gilbert
@BradGilbert Eu meio que presumi que alguém iria aparecer dizendo que quando eu fiz o comentário :-)
user0721090601
1

Oi @ milou123 Também fiquei um pouco surpreso ao ver que o raku reverte para representação decimal - posso ver que alguns contextos - como ensinar aritmética fracionária se beneficiariam de ter um modo "manter como rato". Dito isto, em última análise, faz sentido que haja apenas uma maneira de criar algo e que decimal seja a representação padrão.

Obviamente, com o raku, você também pode mudar um pouco o idioma. Nesse caso, eu inventei um novo operador postfix '→' ...

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

Eu não sou inteligente o suficiente para descobrir se o método 'raku' embutido pode ser substituído de uma maneira semelhante, gostaria de ver conselhos sobre como fazer isso de forma concisa ...

p6steve
fonte