diff options
author | Lars Buitinck <larsmans@gmail.com> | 2013-12-26 14:12:53 +0100 |
---|---|---|
committer | Lars Buitinck <larsmans@gmail.com> | 2013-12-26 14:12:53 +0100 |
commit | dff072619643c6d668446b229d44b7e4d45e6ec0 (patch) | |
tree | 81150b775318a245c5c85aa4b41e615eb39c70ae /numpy/linalg/tests | |
parent | 61998c22df08e7ec0938bedef931ac824cfb634a (diff) | |
download | numpy-dff072619643c6d668446b229d44b7e4d45e6ec0.tar.gz |
BUG: linalg: norm fails on longdouble, signed int
This fixes the following bug with longdouble:
>>> x = np.arange(10, dtype=np.longdouble)
>>> np.linalg.norm(x, ord=3)
Traceback (most recent call last):
File "<ipython-input-5-7ee53a8ac142>", line 1, in <module>
np.linalg.norm(x, ord=3)
File "/tmp/v/lib/python2.7/site-packages/numpy/linalg/linalg.py", line 2090, in norm
return add.reduce(absx**ord, axis=axis)**(1.0/ord)
UnboundLocalError: local variable 'absx' referenced before assignment
As well as the handling of minimal values for signed integers:
>>> x = np.array([-2**31], dtype=np.int32)
>>> np.linalg.norm(x, ord=3)
/tmp/v/lib/python2.7/site-packages/numpy/linalg/linalg.py:2090: RuntimeWarning: invalid value encountered in double_scalars
return add.reduce(absx**ord, axis=axis)**(1.0/ord)
nan
Diffstat (limited to 'numpy/linalg/tests')
-rw-r--r-- | numpy/linalg/tests/test_linalg.py | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/numpy/linalg/tests/test_linalg.py b/numpy/linalg/tests/test_linalg.py index dd4cbcc4f..feb4c8224 100644 --- a/numpy/linalg/tests/test_linalg.py +++ b/numpy/linalg/tests/test_linalg.py @@ -909,6 +909,18 @@ class _TestNorm(object): assert_raises(ValueError, norm, B, None, (2, 3)) assert_raises(ValueError, norm, B, None, (0, 1, 2)) + def test_longdouble_norm(self): + # Non-regression test: p-norm of longdouble would previously raise + # UnboundLocalError. + x = np.arange(10, dtype=np.longdouble) + old_assert_almost_equal(norm(x, ord=3), 12.65, decimal=2) + + def test_intmin(self): + # Non-regression test: p-norm of signed integer would previously do + # float cast and abs in the wrong order. + x = np.array([-2 ** 31], dtype=np.int32) + old_assert_almost_equal(norm(x, ord=3), 2 ** 31, decimal=5) + class TestNormDouble(_TestNorm): dt = np.double |