package funobject /** Rational number is a number that can be expressed as ratio of n/d, * where n and d are integers, except that d can not be zero. */ class Rational(n: Int, d: Int) extends Ordered[Rational] { require(d != 0) private val g = gcd(n.abs, d.abs) val nomer = (if (d < 0) -n else n) / g val denom = d.abs / g def this(n: Int) = this(n, 1) def unary_- = new Rational(-nomer, denom) def + (that: Rational):Rational = new Rational (nomer * that.denom + that.nomer * denom, denom * that.denom) def - (that: Rational):Rational = -this + that def * (that: Rational):Rational = new Rational (nomer * that.nomer, denom * that.denom) def / (that: Rational):Rational = new Rational (nomer * that.denom, denom * that.nomer) override def equals (other: Any): Boolean = other match { case that: Rational => this.nomer == that.nomer && this.denom == that.denom case _ => false } override def compare(that: Rational) = this.nomer * that.denom - that.nomer * this.denom override def compareTo(that: Rational) = this.compare(that) override def <= (that: Rational): Boolean = compare(that) <= 0 override def >= (that: Rational): Boolean = compare(that) >= 0 override def < (that: Rational): Boolean = compare(that) < 0 override def > (that: Rational): Boolean = compare(that) > 0 override def toString = nomer + "/" + denom private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b) } object Rational { implicit def implicitRationalFromInt(i: Int): Rational = new Rational(i) def apply(n: Int, d: Int) = new Rational(n, d) def apply(n: Int) = new Rational(n) }
June 24, 2010
class Rational from Programming in Scala
A specification for class Rational from Programming in Scala
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment