Feature #4667 » 0002-whitespace-fixes-for-the-mathn-library.patch
lib/mathn.rb | ||
---|---|---|
class Rational
|
||
remove_method :**
|
||
##
|
||
# exponentiate by +other+
|
||
def ** (other)
|
||
if other.kind_of?(Rational)
|
||
other2 = other
|
||
if self < 0
|
||
return Complex(self, 0.0) ** other
|
||
return Complex(self, 0.0) ** other
|
||
elsif other == 0
|
||
return Rational(1,1)
|
||
return Rational(1,1)
|
||
elsif self == 0
|
||
return Rational(0,1)
|
||
return Rational(0,1)
|
||
elsif self == 1
|
||
return Rational(1,1)
|
||
return Rational(1,1)
|
||
end
|
||
npd = numerator.prime_division
|
||
dpd = denominator.prime_division
|
||
if other < 0
|
||
other = -other
|
||
npd, dpd = dpd, npd
|
||
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
|
||
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
|
||
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)
|
||
... | ... | |
elsif other.kind_of?(Integer)
|
||
if other > 0
|
||
num = numerator ** other
|
||
den = denominator ** other
|
||
num = numerator ** other
|
||
den = denominator ** other
|
||
elsif other < 0
|
||
num = denominator ** -other
|
||
den = numerator ** -other
|
||
num = denominator ** -other
|
||
den = numerator ** -other
|
||
elsif other == 0
|
||
num = 1
|
||
den = 1
|
||
num = 1
|
||
den = 1
|
||
end
|
||
Rational(num, den)
|
||
elsif other.kind_of?(Float)
|
||
... | ... | |
if a.kind_of?(Complex)
|
||
abs = sqrt(a.real*a.real + a.imag*a.imag)
|
||
# if not abs.kind_of?(Rational)
|
||
# return a**Rational(1,2)
|
||
# return a**Rational(1,2)
|
||
# end
|
||
x = sqrt((a.real + abs)/Rational(2))
|
||
y = sqrt((-a.real + abs)/Rational(2))
|
||
# if !(x.kind_of?(Rational) and y.kind_of?(Rational))
|
||
# return a**Rational(1,2)
|
||
# return a**Rational(1,2)
|
||
# end
|
||
if a.imag >= 0
|
||
Complex(x, y)
|
||
Complex(x, y)
|
||
else
|
||
Complex(x, -y)
|
||
Complex(x, -y)
|
||
end
|
||
elsif a.respond_to?(:nan?) and a.nan?
|
||
a
|
||
... | ... | |
byte_a = [src & 0xffffffff]
|
||
# ruby's bug
|
||
while (src >= max) and (src >>= 32)
|
||
byte_a.unshift src & 0xffffffff
|
||
byte_a.unshift src & 0xffffffff
|
||
end
|
||
answer = 0
|
||
main = 0
|
||
side = 0
|
||
for elm in byte_a
|
||
main = (main << 32) + elm
|
||
side <<= 16
|
||
if answer != 0
|
||
if main * 4 < side * side
|
||
applo = main.div(side)
|
||
else
|
||
applo = ((sqrt!(side * side + 4 * main) - side)/2.0).to_i + 1
|
||
end
|
||
else
|
||
applo = sqrt!(main).to_i + 1
|
||
end
|
||
while (x = (side + applo) * applo) > main
|
||
applo -= 1
|
||
end
|
||
main -= x
|
||
answer = (answer << 16) + applo
|
||
side += applo * 2
|
||
main = (main << 32) + elm
|
||
side <<= 16
|
||
if answer != 0
|
||
if main * 4 < side * side
|
||
applo = main.div(side)
|
||
else
|
||
applo = ((sqrt!(side * side + 4 * main) - side)/2.0).to_i + 1
|
||
end
|
||
else
|
||
applo = sqrt!(main).to_i + 1
|
||
end
|
||
while (x = (side + applo) * applo) > main
|
||
applo -= 1
|
||
end
|
||
main -= x
|
||
answer = (answer << 16) + applo
|
||
side += applo * 2
|
||
end
|
||
if main == 0
|
||
answer
|
||
answer
|
||
else
|
||
sqrt!(a)
|
||
sqrt!(a)
|
||
end
|
||
end
|
||
end
|
- « Previous
- 1
- 2
- 3
- Next »