class SeasidesFraction::Fraction

Fraction represents a rational number. The usual mathematical operations (+, -, *, /) work, as well as getting the negative value and the inverse.

Constants

NAN

Attributes

denominator[R]
numerator[R]

Public Class Methods

[](numerator = 0, denominator = 1) click to toggle source
# File lib/seasides_fraction.rb, line 26
def self.[](numerator = 0, denominator = 1)
  new(numerator, denominator)
end
new(numerator = 0, denominator = 1) click to toggle source
# File lib/seasides_fraction.rb, line 30
def initialize(numerator = 0, denominator = 1)
  if denominator.zero?
    @nominator = @denominator = NAN.numerator, NAN.denominator
  else
    normalize(denominator, numerator)
  end
end
zero() click to toggle source
# File lib/seasides_fraction.rb, line 22
def self.zero
  new(0, 1)
end

Public Instance Methods

*(other) click to toggle source
# File lib/seasides_fraction.rb, line 73
def *(other)
  self.class[numerator * other.numerator, denominator * other.denominator]
end
+(other) click to toggle source
# File lib/seasides_fraction.rb, line 60
def +(other)
  gcd = denominator.gcd other.denominator
  self.class.new(numerator * (other.denominator / gcd) + other.numerator * (denominator / gcd), (denominator * other.denominator) / gcd)
end
-(other) click to toggle source
# File lib/seasides_fraction.rb, line 65
def -(other)
  self + -other
end
-@() click to toggle source
# File lib/seasides_fraction.rb, line 69
def -@
  self.class.new(-numerator, denominator)
end
/(other) click to toggle source
# File lib/seasides_fraction.rb, line 77
def /(other)
  return NAN if other.zero?

  self * other.invert
end
==(other) click to toggle source
# File lib/seasides_fraction.rb, line 56
def ==(other)
  numerator == other.numerator && denominator == other.denominator
end
invert() click to toggle source
# File lib/seasides_fraction.rb, line 87
def invert
  self.class.new(denominator, numerator)
end
normalize(denominator, numerator) click to toggle source
# File lib/seasides_fraction.rb, line 38
def normalize(denominator, numerator)
  gcd          = numerator.gcd denominator
  @numerator   = numerator / gcd
  @denominator = denominator / gcd
  normalize_sign
end
normalize_sign() click to toggle source
# File lib/seasides_fraction.rb, line 45
def normalize_sign
  return unless @denominator.negative?

  @denominator = -@denominator
  @numerator   = -@numerator
end
to_s() click to toggle source
# File lib/seasides_fraction.rb, line 52
def to_s
  "#{numerator} / #{denominator}"
end
zero?() click to toggle source
# File lib/seasides_fraction.rb, line 83
def zero?
  self == self.class.zero
end