Formatting 在sympy和#x27中,未将X*X*X合同授予pow(X,3);s`printing.ccode`方法

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

我有一个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
>>> 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优化)