Class: SeasidesFraction::Fraction
- Inherits:
-
Object
- Object
- SeasidesFraction::Fraction
- 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
-
#denominator ⇒ Object
readonly
Returns the value of attribute denominator.
-
#numerator ⇒ Object
readonly
Returns the value of attribute numerator.
Class Method Summary collapse
Instance Method Summary collapse
- #*(other) ⇒ Object
- #+(other) ⇒ Object
- #-(other) ⇒ Object
- #-@ ⇒ Object
- #/(other) ⇒ Object
- #==(other) ⇒ Object
-
#initialize(numerator = 0, denominator = 1) ⇒ Fraction
constructor
A new instance of Fraction.
- #invert ⇒ Object
- #normalize(denominator, numerator) ⇒ Object
- #normalize_sign ⇒ Object
- #to_s ⇒ Object
- #zero? ⇒ Boolean
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
#denominator ⇒ Object (readonly)
Returns the value of attribute denominator.
10 11 12 |
# File 'lib/seasides_fraction.rb', line 10 def denominator @denominator end |
#numerator ⇒ Object (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 |
.zero ⇒ Object
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 |
#invert ⇒ Object
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_sign ⇒ Object
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_s ⇒ Object
52 53 54 |
# File 'lib/seasides_fraction.rb', line 52 def to_s "#{numerator} / #{denominator}" end |
#zero? ⇒ Boolean
83 84 85 |
# File 'lib/seasides_fraction.rb', line 83 def zero? self == self.class.zero end |