*/
int sign_;
unsigned int num_, den_;
- void normalise ();
+ void normalize ();
void copy (Rational const &);
public:
Rational trunc_rat () const;
Rational div_rat (Rational) const;
Rational mod_rat (Rational) const;
+ Rational abs () const;
void negate ();
int to_int () const;
- operator bool () const;
+
operator double () const;
Rational operator - () const;
Initialize to 0.
*/
Rational ();
- Rational (int);
Rational (int, int);
Rational (double);
Rational (Rational const &r) { copy (r);}
};
#include "arithmetic-operator.hh"
+
IMPLEMENT_ARITHMETIC_OPERATOR (Rational, /);
IMPLEMENT_ARITHMETIC_OPERATOR (Rational, +);
IMPLEMENT_ARITHMETIC_OPERATOR (Rational, *);
return ((double)sign_) * num_ / den_;
}
-Rational::operator bool () const
-{
- return sign_ && num_;
-}
#ifdef STREAM_SUPPORT
ostream &
}
#endif
+Rational
+Rational::abs () const
+{
+ return Rational (num_, den_);
+}
+
Rational
Rational::trunc_rat () const
{
Rational::Rational (int n, int d)
{
sign_ = ::sign (n) * ::sign (d);
- num_ = abs (n);
- den_ = abs (d);
- normalise ();
-}
-
-Rational::Rational (int n)
-{
- sign_ = ::sign (n);
- num_ = abs (n);
- den_ = 1;
+ num_ = ::abs (n);
+ den_ = ::abs (d);
+ normalize ();
}
static inline
}
void
-Rational::normalise ()
+Rational::normalize ()
{
if (!sign_)
{
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);
- normalise ();
+ num_ = ::abs (n);
+ den_ = ::abs (d);
+ normalize ();
}
return *this;
}
num_ = (unsigned int) (mantissa * FACT);
den_ = (unsigned int) FACT;
- normalise ();
+ normalize ();
if (expt < 0)
den_ <<= -expt;
else
num_ <<= expt;
- normalise ();
+ normalize ();
}
else
{
num_ = 0;
den_ = 1;
sign_ = 0;
- normalise ();
+ normalize ();
}
}
num_ *= r.num_;
den_ *= r.den_;
- normalise ();
+ normalize ();
exit_func:
return *this;
}