~ubuntu-branches/ubuntu/precise/rakudo/precise

« back to all changes in this revision

Viewing changes to src/core/Rat.pm

  • Committer: Bazaar Package Importer
  • Author(s): Alessandro Ghedini
  • Date: 2011-05-17 11:31:09 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20110517113109-rmfir654u1axbpt4
Tags: 0.1~2011.04-1
* New upstream release (Closes: #601862, #585762, #577502)
* New maintainer
* Switch to 3.0 (quilt) format
* Update dependencies (Closes: #584498)
* Update debian/copyright to lastest DEP5 revision
* Do not generate/install perl6 manpage (now done by the build system)
* Enable tests
* Bump Standards-Version to 3.9.2 (no changes needed)
* Do not install extra LICENSE files and duplicated docs
* Remove debian/clean (no more needed)
* Add Vcs-* fields in debian/control
* Rewrite (short) description
* Update upstream copyright years
* Upload to unstable

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
class Rat is Cool does Real {
 
2
    has $.numerator;
 
3
    has $.denominator;
 
4
 
 
5
 
 
6
    multi method new() {
 
7
        self.bless(*, :numerator(0), :denominator(1));
 
8
 
 
9
    }
 
10
 
 
11
    multi method new(Int $numerator is copy, Int $denominator is copy) {
 
12
        if $denominator < 0 {
 
13
            $numerator = -$numerator;
 
14
            $denominator = -$denominator;
 
15
        }
 
16
        my $gcd = gcd($numerator, $denominator);
 
17
        $numerator = $numerator div $gcd;
 
18
        $denominator = $denominator div $gcd;
 
19
        self.bless(*, :numerator($numerator), :denominator($denominator));
 
20
    }
 
21
 
 
22
    multi method nude() { $.numerator, $.denominator; }
 
23
 
 
24
    multi method perl() { "$!numerator/$!denominator"; }
 
25
 
 
26
    method Bridge() {
 
27
        $!denominator == 0 ?? Inf * $!numerator.sign
 
28
                           !! $!numerator.Bridge / $!denominator.Bridge;
 
29
    }
 
30
 
 
31
    method Bool() { $!numerator != 0 ?? Bool::True !! Bool::False }
 
32
 
 
33
    method Rat(Real $epsilon = 1.0e-6) { self; }
 
34
 
 
35
    method Num() {
 
36
        $!denominator == 0 ?? Inf * $!numerator.sign
 
37
                           !! $!numerator.Num / $!denominator.Num;
 
38
    }
 
39
 
 
40
    method succ {
 
41
        Rat.new($!numerator + $!denominator, $!denominator);
 
42
    }
 
43
 
 
44
    method pred {
 
45
        Rat.new($!numerator - $!denominator, $!denominator);
 
46
    }
 
47
}
 
48
 
 
49
multi sub prefix:<->(Rat $a) {
 
50
    Rat.new(-$a.numerator, $a.denominator);
 
51
}
 
52
 
 
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);
 
57
}
 
58
 
 
59
multi sub infix:<+>(Rat $a, Int $b) {
 
60
    ($a.numerator + $b * $a.denominator) / $a.denominator;
 
61
}
 
62
 
 
63
multi sub infix:<+>(Int $a, Rat $b) {
 
64
    ($a * $b.denominator + $b.numerator) / $b.denominator;
 
65
}
 
66
 
 
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);
 
71
}
 
72
 
 
73
multi sub infix:<->(Rat $a, Int $b) {
 
74
    ($a.numerator - $b * $a.denominator) / $a.denominator;
 
75
}
 
76
 
 
77
multi sub infix:<->(Int $a, Rat $b) {
 
78
    ($a * $b.denominator - $b.numerator) / $b.denominator;
 
79
}
 
80
 
 
81
multi sub infix:<*>(Rat $a, Rat $b) {
 
82
    ($a.numerator * $b.numerator) / ($a.denominator * $b.denominator);
 
83
}
 
84
 
 
85
multi sub infix:<*>(Rat $a, Int $b) {
 
86
    ($a.numerator * $b) / $a.denominator;
 
87
}
 
88
 
 
89
multi sub infix:<*>(Int $a, Rat $b) {
 
90
    ($a * $b.numerator) / $b.denominator;
 
91
}
 
92
 
 
93
multi sub infix:</>(Rat $a, Rat $b) {
 
94
    ($a.numerator * $b.denominator) / ($a.denominator * $b.numerator);
 
95
}
 
96
 
 
97
multi sub infix:</>(Rat $a, Int $b) {
 
98
    $a.numerator / ($a.denominator * $b);
 
99
}
 
100
 
 
101
multi sub infix:</>(Int $a, Rat $b) {
 
102
    ($b.denominator * $a) / $b.numerator;
 
103
}
 
104
 
 
105
multi sub infix:</>(Int $a, Int $b) {
 
106
    Rat.new($a, $b);
 
107
}
 
108
 
 
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;
 
113
}
 
114
 
 
115
# vim: ft=perl6 sw=4 ts=4 expandtab