【发布时间】:2017-02-06 12:03:30
【问题描述】:
我需要计算一些包含公共子表达式的相当长的表达式。例如,考虑以下两个表达式:
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。问题是编译器是否会认识到这一点。我发现使用 MATLAB 的 MuPad 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 编译器,但我猜它们都做几乎相同的事情。
【问题讨论】: