Class: SeasidesFraction::Fraction

Inherits:
Object
  • Object
show all
Defined in:
lib/seasides_fraction.rb

Overview

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

Constant Summary collapse

NAN =
new do
  def numerator
    :not_a_number
  end

  def denominator
    :not_a_number
  end
end

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(numerator = 0, denominator = 1) ⇒ Fraction

Returns a new instance of Fraction.



30
31
32
33
34
35
36
# 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

Instance Attribute Details

#denominatorObject (readonly)

Returns the value of attribute denominator.



10
11
12
# File 'lib/seasides_fraction.rb', line 10

def denominator
  @denominator
end

#numeratorObject (readonly)

Returns the value of attribute numerator.



10
11
12
# File 'lib/seasides_fraction.rb', line 10

def numerator
  @numerator
end

Class Method Details

.[](numerator = 0, denominator = 1) ⇒ Object



26
27
28
# File 'lib/seasides_fraction.rb', line 26

def self.[](numerator = 0, denominator = 1)
  new(numerator, denominator)
end

.zeroObject



22
23
24
# File 'lib/seasides_fraction.rb', line 22

def self.zero
  new(0, 1)
end

Instance Method Details

#*(other) ⇒ Object



73
74
75
# File 'lib/seasides_fraction.rb', line 73

def *(other)
  self.class[numerator * other.numerator, denominator * other.denominator]
end

#+(other) ⇒ Object



60
61
62
63
# 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) ⇒ Object



65
66
67
# File 'lib/seasides_fraction.rb', line 65

def -(other)
  self + -other
end

#-@Object



69
70
71
# File 'lib/seasides_fraction.rb', line 69

def -@
  self.class.new(-numerator, denominator)
end

#/(other) ⇒ Object



77
78
79
80
81
# File 'lib/seasides_fraction.rb', line 77

def /(other)
  return NAN if other.zero?

  self * other.invert
end

#==(other) ⇒ Object



56
57
58
# File 'lib/seasides_fraction.rb', line 56

def ==(other)
  numerator == other.numerator && denominator == other.denominator
end

#invertObject



87
88
89
# File 'lib/seasides_fraction.rb', line 87

def invert
  self.class.new(denominator, numerator)
end

#normalize(denominator, numerator) ⇒ Object



38
39
40
41
42
43
# 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_signObject



45
46
47
48
49
50
# File 'lib/seasides_fraction.rb', line 45

def normalize_sign
  return unless @denominator.negative?

  @denominator = -@denominator
  @numerator   = -@numerator
end

#to_sObject



52
53
54
# File 'lib/seasides_fraction.rb', line 52

def to_s
  "#{numerator} / #{denominator}"
end

#zero?Boolean

Returns:

  • (Boolean)


83
84
85
# File 'lib/seasides_fraction.rb', line 83

def zero?
  self == self.class.zero
end