Formatting 在sympy和#x27中,未将X*X*X合同授予pow(X,3);s`printing.ccode`方法
我有一个Symphy方程,我需要翻译成CUDA 在默认配置中,Formatting 在sympy和#x27中,未将X*X*X合同授予pow(X,3);s`printing.ccode`方法,formatting,metaprogramming,sympy,Formatting,Metaprogramming,Sympy,我有一个Symphy方程,我需要翻译成CUDA 在默认配置中,sympy.printing.ccode将表达式x*x转换为pow(x,2),不幸的是,CUDA的行为有点奇怪(例如,根据CUDA,pow(0.1,2)为0) 我希望sympy.printing.ccode保持这些类型的表达式不变,或者换句话说,我希望它将pow的任何实例扩展为一个简单的产品。例如,pow(x,4)将变成x*x*x——有人知道如何做到这一点吗?这应该做到: >>> import sympy as sp
sympy.printing.ccode
将表达式x*x
转换为pow(x,2)
,不幸的是,CUDA的行为有点奇怪(例如,根据CUDA,pow(0.1,2)为0)
我希望sympy.printing.ccode保持这些类型的表达式不变,或者换句话说,我希望它将pow的任何实例扩展为一个简单的产品。例如,pow(x,4)
将变成x*x*x
——有人知道如何做到这一点吗?这应该做到:
>>> import sympy as sp
>>> from sympy.utilities.codegen import CCodePrinter
>>> print(sp.__version__)
0.7.6.1
>>> x = sp.Symbol('x')
>>> CCodePrinter().doprint(x*x*x)
'pow(x, 3)'
>>> class MyCCodePrinter(CCodePrinter):
... def _print_Pow(self, expr):
... if expr.exp.is_integer and expr.exp.is_number:
... return '(' + '*'.join([self._print(expr.base)]*expr.exp) + ')'
... else:
... return super(MyCCodePrinter, self)._print_Pow(expr)
...
>>> MyCCodePrinter().doprint(x*x*x)
'x*x*x'
请注意,这是一个建议的更改(对指数的大小有限制)。然后,动机是常规C代码的性能,但是像
-ffast math
这样的标志就变得毫无意义了。但是,如果这对CUDA代码有用,我们肯定应该通过设置来支持该行为,如果您认为需要,请随时为其打开一个问题。谢谢。它可以做到这一点,但如果指数为负,则可能会产生错误。例如,x**-3
产生1.0/x*x*x
。我通过用括号包装第一个返回的字符串实现了一个快速修复。像这样:return'('+'*'.join([self.\u print(expr.base)]*expr.exp)+'
我已经在答案中添加了它。另请参见:(使用create\u expand\u pow\u优化)