Package sympycore :: Package arithmetic :: Module evalf
[hide private]
[frames] | no frames]

Source Code for Module sympycore.arithmetic.evalf

 1  """Provides low-level evalf function.
 
 2  """ 
 3  
 
 4  __all__ = ['evalf'] 
 5  
 
 6  from .numbers import Float, Complex 
 7  
 
 8  import math 
 9  import cmath 
10  import re 
11  import mpmath 
12  
 
13  int_pattern = re.compile('\d+([.]\d+)?') 
14  
 
15 -def quote_numbers(s, format):
16 return int_pattern.sub(lambda m: (format % m.group()), s)
17
18 -def replace_names(s, names):
19 for name, new in names.items(): 20 s = s.replace(name, new) 21 return s
22
23 -def f_header(symbols):
24 if isinstance(symbols, (tuple, list)): 25 return "lambda %s: " % ",".join(map(str, symbols)) 26 if not symbols: 27 return "lambda: " 28 return "lambda %s: " % symbols
29
30 -def convert_mpmath(expr):
31 s = str(expr) 32 s = quote_numbers(s, "mpf(%s)") 33 s = replace_names(s, { 'I':'j', 'E':'e', 'oo':'inf','undefined':'nan'}) 34 return s
35
36 -def compile_mpmath(symbols, expr):
37 s = convert_mpmath(expr) 38 f = eval(f_header(symbols) + s, vars(mpmath)) 39 return f
40
41 -def mpmath_to_numbers(x, digits):
42 prec = int(digits*3.33) + 12 43 if isinstance(x, mpmath.mpc): 44 return Complex(Float(x.real.val, prec), Float(x.imag.val, prec)) 45 a = object.__new__(Float) 46 a.val = x.val 47 a.prec = prec 48 return a
49
50 -def evalf(expr, digits=15):
51 s = convert_mpmath(expr) 52 mpmath.mpf.dps = digits + 4 53 return mpmath_to_numbers(eval(s, vars(mpmath)), digits)
54