Class: Rational
- Inherits:
-
Object
- Object
- Rational
- Defined in:
- lib/mathn.rb
Overview
When mathn is required Rational is changed to simplify the use of Rational operations.
Normal behaviour:
Rational.new!(1,3) ** 2 # => Rational(1, 9)
(1 / 3) ** 2 # => 0
require ‘mathn’ behaviour:
(1 / 3) ** 2 # => 1/9
Instance Method Summary collapse
-
#**(other) ⇒ Object
Exponentiate by
other
.
Instance Method Details
#**(other) ⇒ Object
Exponentiate by other
(1/3) ** 2 # => 1/9
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
# File 'lib/mathn.rb', line 138 def ** (other) if other.kind_of?(Rational) other2 = other if self < 0 return Complex(self, 0.0) ** other elsif other == 0 return Rational(1,1) elsif self == 0 return Rational(0,1) elsif self == 1 return Rational(1,1) end npd = numerator.prime_division dpd = denominator.prime_division if other < 0 other = -other npd, dpd = dpd, npd end for elm in npd elm[1] = elm[1] * other if !elm[1].kind_of?(Integer) and elm[1].denominator != 1 return Float(self) ** other2 end elm[1] = elm[1].to_i end for elm in dpd elm[1] = elm[1] * other if !elm[1].kind_of?(Integer) and elm[1].denominator != 1 return Float(self) ** other2 end elm[1] = elm[1].to_i end num = Integer.from_prime_division(npd) den = Integer.from_prime_division(dpd) Rational(num,den) elsif other.kind_of?(Integer) if other > 0 num = numerator ** other den = denominator ** other elsif other < 0 num = denominator ** -other den = numerator ** -other elsif other == 0 num = 1 den = 1 end Rational(num, den) elsif other.kind_of?(Float) Float(self) ** other else x , y = other.coerce(self) x ** y end end |