Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
start to switch some arithmetic ops to smart Rat/FatRat semantics
  • Loading branch information
moritz committed Feb 12, 2012
1 parent 7f1a890 commit 4ab4ffa
Showing 1 changed file with 47 additions and 21 deletions.
68 changes: 47 additions & 21 deletions src/core/Rat.pm
Expand Up @@ -89,27 +89,53 @@ sub DIVIDE_NUMBERS(Int:D \$nu, Int:D \$de, $t1, $t2) {
multi prefix:<->(Rat \$a) {
Rat.new(-$a.numerator, $a.denominator);
}

multi infix:<+>(Rat \$a, Rat \$b) {
my $gcd = $a.denominator gcd $b.denominator;
($a.numerator * ($b.denominator div $gcd) + $b.numerator * ($a.denominator div $gcd))
/ (($a.denominator div $gcd) * $b.denominator);
}
multi sub infix:<+>(Rat \$a, Int \$b) {
($a.numerator + $b * $a.denominator) / $a.denominator;
}
multi sub infix:<+>(Int \$a, Rat \$b) {
($a * $b.denominator + $b.numerator) / $b.denominator;
}

multi sub infix:<->(Rat \$a, Rat \$b) {
my $gcd = $a.denominator gcd $b.denominator;
($a.numerator * ($b.denominator div $gcd) - $b.numerator * ($a.denominator div $gcd))
/ (($a.denominator div $gcd) * $b.denominator);
}

multi sub infix:<->(Rat \$a, Int \$b) {
($a.numerator - $b * $a.denominator) / $a.denominator;
multi prefix:<->(FatRat \$a) {
FatRat.new(-$a.numerator, $a.denominator);
}

multi infix:<+>(Rational \$a, Rational \$b) {
my Int $gcd := $a.denominator gcd $b.denominator;
DIVIDE_NUMBERS(
($a.numerator * ($b.denominator div $gcd) + $b.numerator * ($a.denominator div $gcd)),
(($a.denominator div $gcd) * $b.denominator),
$a,
$b,
);
}
multi sub infix:<+>(Rational \$a, Int \$b) {
DIVIDE_NUMBERS(
($a.numerator + $b * $a.denominator),
$a.denominator,
$a,
$b,
);
}
multi sub infix:<+>(Int \$a, Rational \$b) {
DIVIDE_NUMBERS(
($a * $b.denominator + $b.numerator),
$b.denominator,
$a,
$b,
);
}

multi sub infix:<->(Rational \$a, Rational \$b) {
my Int $gcd = $a.denominator gcd $b.denominator;
DIVIDE_NUMBERS(
($a.numerator * ($b.denominator div $gcd) - $b.numerator * ($a.denominator div $gcd)),
(($a.denominator div $gcd) * $b.denominator),
$a,
$b,
);
}

multi sub infix:<->(Rational \$a, Int \$b) {
DIVIDE_NUMBERS(
($a.numerator - $b * $a.denominator),
$a.denominator,
$a,
$b,
);
}

multi sub infix:<->(Int \$a, Rat \$b) {
Expand Down

0 comments on commit 4ab4ffa

Please sign in to comment.