Я использую Sympy для манипулирования и дифференцирования определяемой пользователем функции ввода для генерации библиотеки C ++ для использования с внешней программой C ++. Это прекрасно работает, за исключением того факта, что Sympy настаивает на выражении 1/2 как 1.0L / 2.0L. Хорошо, за исключением того, что некоторые переменные в основном коде имеют тип std :: complex, так что это вызывает ошибку во время компиляции, поскольку он не может (неявно) умножить / добавить / вычесть комплекс с длинными двойными (или целыми числами), в этом отношении). Я попытался скомпилировать с -std = c ++ 14, так как здесь больше поддержки для неявного приведения типов, но «проблема» сохраняется.
Тем временем я написал набор вспомогательных функций для работы с этими операциями, но мне было интересно, есть ли какой-нибудь способ сказать Sympy, что нужно вывести любое числовое значение, которое у него есть, как double? Например, вместо вывода 1.0L / 2.0L в код на C, можно ли заставить его просто написать 1.0 / 2.0 (или даже 0.5)? Аналогично, вместо написания типа int, такого как 2, я бы хотел написать 2.0. Я попытался установить флаг точности (при вызове функции sympy.printing.ccode), но это ничего не изменило. Я не мог найти что-нибудь в Интернете
Буду очень признателен за любой совет.
Большое спасибо,
Сэм
Прямо сейчас нет возможности для этого (я открыл вопрос для этого).
Обходной путь к подклассу sympy.printing.ccode.CCodePrinter
и переопределить _print_Rational
, Это текущее определение:
def _print_Rational(self, expr):
p, q = int(expr.p), int(expr.q)
return '%d.0L/%d.0L' % (p, q)
Таким образом, вы можете написать что-то вроде
class MyCCodePrinter(CCodePrinter):
def _print_Rational(self, expr):
p, q = int(expr.p), int(expr.q)
return '%d.0/%d.0' % (p, q)
Затем вы можете распечатать выражения с MyCCodePrinter().doprint(expr)
,
Других решений пока нет …