0
我需要計算一些包含常見子表達式的相當長的表達式。例如,請考慮以下兩個表達式:編譯器常見子表達式消除有效嗎?
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編譯器,但我想他們都做幾乎相同的事情。