]> git.donarmstrong.com Git - lilypond.git/blobdiff - flower/rational.cc
*** empty log message ***
[lilypond.git] / flower / rational.cc
index a21b939565b09fb41662f4c98954f2bd3c513650..5b0657a49aac5014e0700c36d565706173bc78a5 100644 (file)
@@ -3,25 +3,31 @@
 
   source file of the Flower Library
 
-  (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1997--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "rational.hh"
 
 #include <cmath>
 #include <cstdlib>
+using namespace std;
 
 #include "string-convert.hh"
 #include "libc-extension.hh"
 
 Rational::operator double () const
 {
-  return (double)sign_ * num_ / den_;
+  return ((double)sign_) * num_ / den_;
+}
+
+Rational::operator bool () const
+{
+  return sign_ && num_;
 }
 
 #ifdef STREAM_SUPPORT
 ostream &
-operator<< (ostream &o, Rational r)
+operator << (ostream &o, Rational r)
 {
   o << r.string ();
   return o;
@@ -52,7 +58,7 @@ Rational::Rational (int n)
 {
   sign_ = ::sign (n);
   num_ = abs (n);
-  den_= 1;
+  den_ = 1;
 }
 
 static inline
@@ -74,7 +80,7 @@ Rational::set_infinite (int s)
 }
 
 Rational
-Rational::operator- () const
+Rational::operator - () const
 {
   Rational r (*this);
   r.negate ();
@@ -140,10 +146,7 @@ Rational::compare (Rational const &r, Rational const &s)
     return 0;
   else if (r.sign_ == 0)
     return 0;
-  else
-    {
-      return r.sign_ * ::sign (int (r.num_ * s.den_) - int (s.num_ * r.den_));
-    }
+  return r.sign_ * ::sign (int (r.num_ * s.den_) - int (s.num_ * r.den_));
 }
 
 int
@@ -153,24 +156,24 @@ compare (Rational const &r, Rational const &s)
 }
 
 Rational &
-Rational::operator%= (Rational r)
+Rational::operator %= (Rational r)
 {
-  *this = r.mod_rat (r);
+  *this = mod_rat (r);
   return *this;
 }
 
 Rational &
-Rational::operator+= (Rational r)
+Rational::operator += (Rational r)
 {
-  if (is_infinity ());
+  if (is_infinity ())
+    ;
   else if (r.is_infinity ())
-    {
-      *this = r;
-    }
+    *this = r;
   else
     {
-      int n = sign_ * num_ *r.den_ + r.sign_ * den_ * r.num_;
-      int d = den_ * r.den_;
+      int lcm = (den_ / gcd (r.den_, den_)) * r.den_;
+      int n = sign_ * num_ * (lcm / den_) + r.sign_ * r.num_ * (lcm / r.den_);
+      int d = lcm;
       sign_ = ::sign (n) * ::sign (d);
       num_ = abs (n);
       den_ = abs (d);
@@ -215,7 +218,7 @@ Rational::Rational (double x)
     {
       num_ = 0;
       den_ = 1;
-      sign_ =0;
+      sign_ = 0;
       normalise ();
     }
 }
@@ -229,7 +232,7 @@ Rational::invert ()
 }
 
 Rational &
-Rational::operator*= (Rational r)
+Rational::operator *= (Rational r)
 {
   sign_ *= ::sign (r.sign_);
   if (r.is_infinity ())
@@ -247,7 +250,7 @@ Rational::operator*= (Rational r)
 }
 
 Rational &
-Rational::operator/= (Rational r)
+Rational::operator /= (Rational r)
 {
   r.invert ();
   return (*this *= r);
@@ -260,7 +263,7 @@ Rational::negate ()
 }
 
 Rational &
-Rational::operator-= (Rational r)
+Rational::operator -= (Rational r)
 {
   r.negate ();
   return (*this += r);
@@ -284,7 +287,7 @@ Rational::to_string () const
 int
 Rational::to_int () const
 {
-  return num () / den ();
+  return (int) num () / den ();
 }
 
 int