Мне нужно вычислить довольно длинные выражения, содержащие общие подвыражения. Например, рассмотрим следующие два выражения:Насколько эффективно устранение общего подвыражения компилятора?
double dfdx1 = 2 * (-x2 + x1 - sin(b2)*n34 + cos(b2)*sin(c2)*n24 - cos(b2)*cos(c2)*n14 + sin(b1)*m34 - cos(b1)*sin(c1)*m24 + cos(b1)*cos(c1)*m14);
double dfdx2 = -2 * (-x2 + x1 - sin(b2)*n34 + cos(b2)*sin(c2)*n24 - cos(b2)*cos(c2)*n14 + sin(b1)*m34 - cos(b1)*sin(c1)*m24 + cos(b1)*cos(c1)*m14);
Помимо устранения всех тригонометрических функций, один очевидный элиминация dfdx2 = -dfdx1
. Вопрос в том, узнает ли компилятор. Я обнаружил, что использование функции MuPad MATLAB generate::optimize()
не делает, что меня очень удивляет.
В более общем плане, будет компилятор признает, что f2 = -f1
в примере ниже:
double f1 = a*a + b*b - c*a - c*b;
double f2 = c*a + c*b - a*a - b*b;
Или это просто ликвидировать условия a*a
, b*b
, c*a
и c*b
?
Я использую компилятор MSVC, но я думаю, что все они делают почти то же самое.