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]