Números racionales en Raku

8

Estoy usando Raku para algunos cálculos, porque tiene buenos tipos numéricos. Sin embargo, tengo un problema con el uso de '.raku'

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

Obtenemos esto. Sin embargo,

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

¿Es un error? Esperaba <1/5>. ¿Lo que pasa?

milou123
fuente
Se eliminó la etiqueta perl ya que esto no pertenece al lenguaje de programación Perl.
ikegami

Respuestas:

11

En Raku, 0.2construye a Rat, y por lo tanto produce el mismo resultado que la escritura 1/5(que se doblará constantemente) o <1/5>(la forma literal). Solo obtienes coma flotante en el caso de especificar un exponente (por ejemplo, 2e-1).

El trabajo del método .raku(anteriormente conocido como el .perl) es producir algo que redondea y produce el mismo valor si EVAL'd. En el caso de 1/5, eso puede representarse exactamente como un decimal, por lo que producirá 0.2. Solo recurre a la representación fraccionaria cuando una forma decimal no se redondea.

Siempre puede recuperar el numerador y el denominador utilizando los métodos .numeratory .denominatorpara formatear como desee. Además, el .nudemétodo devuelve una lista del numerador y el denominador, que se puede unir con un /si se desea:

say (1/6+1/6).nude.join("/");     # 1/3
say (1/10+1/10).nude.join("/");   # 1/5
Jonathan Worthington
fuente
.nudemejor nombre de método involuntariamente divertido
user0721090601
1
¿Quién dice que no fue intencional?
Holli
1
@ user0721090601 Según cómo Larry lo ha mencionado en las entrevistas, apostaría a que es intencional.
Brad Gilbert
@BradGilbert Asumí que alguien aparecería para decir eso cuando hice el comentario :-)
user0721090601
1

Hola @ milou123 También me sorprendió un poco que el raku vuelva a la representación decimal, puedo ver que algunos contextos, como enseñar aritmética fraccional, se beneficiarían de tener un modo "mantener como rata". Dicho esto, en última instancia, tiene sentido que solo haya una forma de rastrear algo y que el decimal sea la representación predeterminada.

Por supuesto, con raku, también puedes cambiar un poco el idioma. En este caso, he inventado un nuevo operador de postfix '→' ...

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

No soy lo suficientemente inteligente como para averiguar si el método incorporado 'raku' puede anularse de manera similar, me gustaría ver consejos sobre cómo hacerlo de manera concisa ...

p6steve
fuente