forked from sympy/sympy
/
ccode.py
52 lines (41 loc) · 1.58 KB
/
ccode.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
"""
C code printer
"""
from str import StrPrinter
from sympy.printing.precedence import precedence, PRECEDENCE
from sympy.core.basic import S
class CCodePrinter(StrPrinter):
"""A printer to convert python expressions to stings of c code"""
def _print_Pow(self, expr):
PREC = precedence(expr)
if expr.exp is S.NegativeOne:
return '1/%s'%(self.parenthesize(expr.base, PREC))
else:
return 'pow(%s,%s)'%(self.parenthesize(expr.base, PREC),
self.parenthesize(expr.exp, PREC))
def _print_Exp1(self, expr):
return "exp(1)"
def _print_Piecewise(self, expr):
ecpairs = ["(%s) {\n%s\n}\n" % (self._print(c), self._print(e)) \
for e, c in expr.args[:-1]]
last_line = ""
if expr.args[-1].cond is S.One:
last_line = "else {\n%s\n}" % self._print(expr.args[-1].expr)
else:
ecpairs.append("(%s) {\n%s\n" % \
(self._print(expr.args[-1].cond),
self._print(expr.args[-1].expr)))
code = "if %s" + last_line
return code % "else if ".join(ecpairs)
def ccode(expr):
r"""Converts an expr to a string of c code
Works for simple expressions using math.h functions.
>>> from sympy import *
>>> from sympy.abc import *
>>> ccode((2*tau)**Rational(7,2))
'8*pow(2,(1/2))*pow(tau,(7/2))'
"""
return CCodePrinter().doprint(expr)
def print_ccode(expr):
"""Prints C representation of the given expression."""
print ccode(expr)