Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OverflowError/TypeError with evalf ceiling(log(1)/log(2)) #17639

Open
Mygod opened this issue Sep 22, 2019 · 3 comments
Open

OverflowError/TypeError with evalf ceiling(log(1)/log(2)) #17639

Mygod opened this issue Sep 22, 2019 · 3 comments

Comments

@Mygod
Copy link

Mygod commented Sep 22, 2019

Python 3.7.3 (default, Apr  3 2019, 19:16:38) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sympy
>>> test = sympy.symbols('test')
>>> print(sympy.ceiling(sympy.log(test) / sympy.log(2)).evalf(subs={test: 1}))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 1442, in evalf
    result = evalf(self, prec + 4, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 1309, in evalf
    r = rf(x, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 410, in evalf_ceiling
    return get_integer_part(expr.args[0], 1, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 400, in get_integer_part
    re_, re_acc = calc_part(re(expr, evaluate=False), ire)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 356, in calc_part
    re_im, size, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 1309, in evalf
    r = rf(x, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 251, in evalf_re
    return get_complex_part(expr.args[0], 0, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 237, in get_complex_part
    res = evalf(expr, workprec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 1309, in evalf
    r = rf(x, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 561, in evalf_mul
    arg = evalf(arg, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 1309, in evalf
    r = rf(x, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 678, in evalf_pow
    re, im, re_acc, im_acc = evalf(base, prec + 5, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 1309, in evalf
    r = rf(x, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 847, in evalf_log
    re = mpf_log(mpf_abs(xre), prec, rnd)
  File "/path/to/lib/python3.7/site-packages/mpmath/libmp/libelefun.py", line 689, in mpf_log
    return from_man_exp(exp*ln2_fixed(wp), -wp, prec, rnd)
  File "/path/to/lib/python3.7/site-packages/mpmath/libmp/libelefun.py", line 98, in g
    newprec = int(prec*1.05+10)
OverflowError: cannot convert float infinity to integer
>>> print(sympy.ceiling(sympy.log(test) / sympy.log(3)).evalf(subs={test: 1}))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 1442, in evalf
    result = evalf(self, prec + 4, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 1309, in evalf
    r = rf(x, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 410, in evalf_ceiling
    return get_integer_part(expr.args[0], 1, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 400, in get_integer_part
    re_, re_acc = calc_part(re(expr, evaluate=False), ire)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 356, in calc_part
    re_im, size, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 1309, in evalf
    r = rf(x, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 251, in evalf_re
    return get_complex_part(expr.args[0], 0, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 237, in get_complex_part
    res = evalf(expr, workprec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 1309, in evalf
    r = rf(x, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 561, in evalf_mul
    arg = evalf(arg, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 1309, in evalf
    r = rf(x, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 678, in evalf_pow
    re, im, re_acc, im_acc = evalf(base, prec + 5, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 1309, in evalf
    r = rf(x, prec, options)
  File "/path/to/lib/python3.7/site-packages/sympy/core/evalf.py", line 847, in evalf_log
    re = mpf_log(mpf_abs(xre), prec, rnd)
  File "/path/to/lib/python3.7/site-packages/mpmath/libmp/libelefun.py", line 736, in mpf_log
    m = -log_agm(to_fixed(x, wp), wp)
  File "/path/to/lib/python3.7/site-packages/mpmath/libmp/libmpf.py", line 518, in to_fixed
    else:           return man >> (-offset)
TypeError: unsupported operand type(s) for >>: 'int' and 'float'
>>> 

Using sympy 1.4. Using a variable seems to be required to reproduce this.

@Mygod Mygod changed the title OverflowError/TypeError with ceiling(log(1)/log(2)) OverflowError/TypeError with evalf ceiling(log(1)/log(2)) Sep 22, 2019
@oscarbenjamin
Copy link
Contributor

It goes wrong here:

sympy/sympy/core/evalf.py

Lines 350 to 356 in 58e7820

ire, iim, ire_acc, iim_acc = evalf(
re_im - nint, 10, options) # don't need much precision
assert not iim
size = -fastlog(ire) + 2 # -ve b/c ire is less than 1
if size > prec:
ire, iim, ire_acc, iim_acc = evalf(
re_im, size, options)

The reim variable is re(log(test)/log(2)) which is zero (if test=1). Then fastlog returns -oo which then give size=oo which is used as the prec argument in the recursive call to evalf. Perhaps size should be bounded at maxprec here.

@Mygod
Copy link
Author

Mygod commented Sep 23, 2019

EDIT: Moved to #17642

@jksuom
Copy link
Member

jksuom commented Sep 23, 2019

The reim variable is re(log(test)/log(2)) which is zero (if test=1).

re_im comes from fzero assigned to ire on this line:

ire, iim, ire_acc, iim_acc = evalf(expr, assumed_size, options)

It seems that the internal evalf is expected to return None instead of fzero. In this case, evalf_mul should have checked the result of log(1)*log(2)**-1.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants