summaryrefslogtreecommitdiff
path: root/numpy/lib/financial.py
diff options
context:
space:
mode:
authorDavid Cournapeau <cournape@gmail.com>2010-03-31 03:45:25 +0000
committerDavid Cournapeau <cournape@gmail.com>2010-03-31 03:45:25 +0000
commit9475b973951f322945a518f1cab62f2a4d21fbc1 (patch)
tree5d6a3f3d16dc5a3fbe7aa9f91fb3c48ba8bab17b /numpy/lib/financial.py
parent6f00924d2ca7a1faf09761a175ad3b4b1b7d0888 (diff)
downloadnumpy-9475b973951f322945a518f1cab62f2a4d21fbc1.tar.gz
BUG: fix div by zero handling in nper.
Diffstat (limited to 'numpy/lib/financial.py')
-rw-r--r--numpy/lib/financial.py26
1 files changed, 18 insertions, 8 deletions
diff --git a/numpy/lib/financial.py b/numpy/lib/financial.py
index 8b77eb3fc..55ed2839e 100644
--- a/numpy/lib/financial.py
+++ b/numpy/lib/financial.py
@@ -255,15 +255,25 @@ def nper(rate, pmt, pv, fv=0, when='end'):
"""
when = _convert_when(when)
rate, pmt, pv, fv, when = map(np.asarray, [rate, pmt, pv, fv, when])
+
+ use_zero_rate = False
+ old_err = np.seterr(divide="raise")
try:
- z = pmt*(1.0+rate*when)/rate
- except ZeroDivisionError:
- z = 0.0
- A = -(fv + pv)/(pmt+0.0)
- B = np.log((-fv+z) / (pv+z))/np.log(1.0+rate)
- miter = np.broadcast(rate, pmt, pv, fv, when)
- zer = np.zeros(miter.shape)
- return np.where(rate==zer, A+zer, B+zer) + 0.0
+ try:
+ z = pmt*(1.0+rate*when)/rate
+ except FloatingPointError:
+ use_zero_rate = True
+ finally:
+ np.seterr(**old_err)
+
+ if use_zero_rate:
+ return (-fv + pv) / (pmt + 0.0)
+ else:
+ A = -(fv + pv)/(pmt+0.0)
+ B = np.log((-fv+z) / (pv+z))/np.log(1.0+rate)
+ miter = np.broadcast(rate, pmt, pv, fv, when)
+ zer = np.zeros(miter.shape)
+ return np.where(rate==zer, A+zer, B+zer) + 0.0
def ipmt(rate, per, nper, pv, fv=0.0, when='end'):
"""