1
class Rat is Cool does Real {
7
self.bless(*, :numerator(0), :denominator(1));
11
multi method new(Int $numerator is copy, Int $denominator is copy) {
13
$numerator = -$numerator;
14
$denominator = -$denominator;
16
my $gcd = gcd($numerator, $denominator);
17
$numerator = $numerator div $gcd;
18
$denominator = $denominator div $gcd;
19
self.bless(*, :numerator($numerator), :denominator($denominator));
22
multi method nude() { $.numerator, $.denominator; }
24
multi method perl() { "$!numerator/$!denominator"; }
27
$!denominator == 0 ?? Inf * $!numerator.sign
28
!! $!numerator.Bridge / $!denominator.Bridge;
31
method Bool() { $!numerator != 0 ?? Bool::True !! Bool::False }
33
method Rat(Real $epsilon = 1.0e-6) { self; }
36
$!denominator == 0 ?? Inf * $!numerator.sign
37
!! $!numerator.Num / $!denominator.Num;
41
Rat.new($!numerator + $!denominator, $!denominator);
45
Rat.new($!numerator - $!denominator, $!denominator);
49
multi sub prefix:<->(Rat $a) {
50
Rat.new(-$a.numerator, $a.denominator);
53
multi sub infix:<+>(Rat $a, Rat $b) {
54
my $gcd = gcd($a.denominator, $b.denominator);
55
($a.numerator * ($b.denominator div $gcd) + $b.numerator * ($a.denominator div $gcd))
56
/ (($a.denominator div $gcd) * $b.denominator);
59
multi sub infix:<+>(Rat $a, Int $b) {
60
($a.numerator + $b * $a.denominator) / $a.denominator;
63
multi sub infix:<+>(Int $a, Rat $b) {
64
($a * $b.denominator + $b.numerator) / $b.denominator;
67
multi sub infix:<->(Rat $a, Rat $b) {
68
my $gcd = gcd($a.denominator, $b.denominator);
69
($a.numerator * ($b.denominator div $gcd) - $b.numerator * ($a.denominator div $gcd))
70
/ (($a.denominator div $gcd) * $b.denominator);
73
multi sub infix:<->(Rat $a, Int $b) {
74
($a.numerator - $b * $a.denominator) / $a.denominator;
77
multi sub infix:<->(Int $a, Rat $b) {
78
($a * $b.denominator - $b.numerator) / $b.denominator;
81
multi sub infix:<*>(Rat $a, Rat $b) {
82
($a.numerator * $b.numerator) / ($a.denominator * $b.denominator);
85
multi sub infix:<*>(Rat $a, Int $b) {
86
($a.numerator * $b) / $a.denominator;
89
multi sub infix:<*>(Int $a, Rat $b) {
90
($a * $b.numerator) / $b.denominator;
93
multi sub infix:</>(Rat $a, Rat $b) {
94
($a.numerator * $b.denominator) / ($a.denominator * $b.numerator);
97
multi sub infix:</>(Rat $a, Int $b) {
98
$a.numerator / ($a.denominator * $b);
101
multi sub infix:</>(Int $a, Rat $b) {
102
($b.denominator * $a) / $b.numerator;
105
multi sub infix:</>(Int $a, Int $b) {
109
multi sub infix:<**>(Rat $a, Int $b) {
110
my $num = $a.numerator ** $b;
111
my $den = $a.denominator ** $b;
112
$num ~~ Int && $den ~~ Int ?? $num / $den !! $a.Bridge ** $b;
115
# vim: ft=perl6 sw=4 ts=4 expandtab