def _print_Pow(self, expr): if expr.base == 2: return "exp2(%s)" % self._print(expr.exp) if expr.base == 10: return "exp10(%s)" % self._print(expr.exp) if expr.exp == 0.5 and isinstance(expr.base, Add): args = expr.base.args if len(args) == 2 and all(map(is_square, args)): if self.order != 'none': args = self._as_ordered_terms(expr.base, order=None) # TODO: (above) is it fine to use `order=None`? return "hypot(%s, %s)" % (self._print(args[0].args[0]), self._print(args[1].args[0])) if expr.exp == Rational(1, 3): return "cbrt(%s)" % self._print(expr.base) if expr.exp.is_integer and expr.exp != -1: return "pown(%s, %s)" % ( self._print(expr.base), self._print(expr.exp)) if expr.exp.is_positive and expr.exp != 0.5: return "powr(%s, %s)" % ( self._print(expr.base), self._print(expr.exp)) return CCodePrinter._print_Pow(self, expr)