lib/xirr/bisection.rb in xirr-0.2.7 vs lib/xirr/bisection.rb in xirr-0.2.8
- old
+ new
@@ -11,10 +11,11 @@
def xirr(midpoint = nil)
# Initial values
left = [BigDecimal.new(-0.99, Xirr::PRECISION), cf.irr_guess].min
right = [BigDecimal.new(9.99, Xirr::PRECISION), cf.irr_guess + 1].max
+ @original_right = right
midpoint ||= cf.irr_guess
runs = 0
# Loops until difference is within error margin
while ((right - left).abs > Xirr::EPS && runs < Xirr.config.iteration_limit.to_i) do
@@ -27,11 +28,11 @@
if runs >= Xirr.config.iteration_limit.to_i
raise ArgumentError, "Did not converge after #{runs} tries."
end
# If enabled, will retry XIRR with NewtonMethod
- if Xirr::FALLBACK && right_limit_reached?(right, midpoint)
+ if Xirr::FALLBACK && right_limit_reached?(midpoint)
return NewtonMethod.new(cf).xirr
end
return midpoint.round Xirr::PRECISION
@@ -41,11 +42,11 @@
# @param right [BigDecimal]
# @param midpoint [BigDecimal]
# @return [Boolean]
# Checks if result is the right limit.
- def right_limit_reached?(right, midpoint)
- (right - midpoint).abs < Xirr::EPS
+ def right_limit_reached?(midpoint)
+ (@original_right - midpoint).abs < Xirr::EPS
end
# @param left [BigDecimal]
# @param midpoint [BigDecimal]
# @param right [BigDecimal]