Rationale Zahlen in Raku

8

Ich benutze Raku für einige Berechnungen, weil es schöne numerische Typen hat. Ich habe jedoch ein Problem mit der Verwendung von '.raku'.

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

Wir erhalten dies. Jedoch,

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

Ist es ein Fehler? Ich habe <1/5> erwartet. Was geschieht?

milou123
quelle
Das Perl- Tag wurde entfernt, da dies nicht die Perl-Programmiersprache betrifft.
Ikegami

Antworten:

11

0.2Konstruiert in Raku a Ratund erzeugt somit das gleiche Ergebnis wie das Schreiben 1/5(das konstant gefaltet wird) oder <1/5>(die wörtliche Form). Sie erhalten nur Gleitkommawerte, wenn Sie einen Exponenten angeben (z. B. 2e-1).

Die Aufgabe der .raku(früher als .perl) bekannten Methode besteht darin, etwas zu erzeugen, das umrundet und den gleichen Wert erzeugt, wenn EVAL'd. Im Fall von 1/5kann dies genau als Dezimalzahl dargestellt werden, sodass es erzeugt wird 0.2. Es wird nur dann auf die gebrochene Darstellung zurückgegriffen, wenn eine Dezimalform nicht umrunden würde.

Sie können den Zähler und den Nenner jederzeit mit den Methoden .numeratorund wiederherstellen, um sie nach Ihren .denominatorWünschen zu formatieren. Zusätzlich gibt die .nudeMethode eine Liste des Zählers und Nenners zurück, die bei Bedarf mit einem /verknüpft werden kann:

say (1/6+1/6).nude.join("/");     # 1/3
say (1/10+1/10).nude.join("/");   # 1/5
Jonathan Worthington
quelle
.nudebester ungewollt lustiger Methodenname
user0721090601
1
Wer sagt, dass es unbeabsichtigt war?
Holli
1
@ user0721090601 Basierend darauf, wie Larry es in Interviews erwähnt hat, würde ich darauf wetten, dass es beabsichtigt ist.
Brad Gilbert
@BradGilbert Ich nahm an, dass jemand vorbeischauen würde, um das zu sagen, als ich den Kommentar machte :-)
user0721090601
1

Hi @ milou123 Ich war auch ein bisschen überrascht, dass Raku zur Dezimaldarstellung zurückkehrt - ich kann sehen, dass einige Kontexte - wie das Unterrichten von Brucharithmetik - von einem "Keep as Rat" -Modus profitieren würden. Allerdings macht es letztendlich Sinn, dass es nur einen Weg gibt, etwas zu rakuieren, und dass die Dezimalzahl die Standarddarstellung ist.

Natürlich können Sie mit Raku auch die Sprache ein wenig ändern. In diesem Fall habe ich einen neuen '→' Postfix-Operator erfunden ...

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

Ich bin nicht klug genug, um herauszufinden, ob die eingebaute 'Raku'-Methode auf ähnliche Weise überschrieben werden kann. Ich würde gerne Ratschläge dazu erhalten, wie man das präzise macht ...

p6steve
quelle