共通の部分式を含むかなり長い式を計算する必要があります。たとえば、以下の2つの式を考える:コンパイラの共通部分式の除去はどれぐらい効果的ですか?
は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);
さておき、すべての三角関数を排除するから、1つの明らかな除去はdfdx2 = -dfdx1
です。問題は、コンパイラがこれを認識するかどうかです。私は、MATLABのMuPad generate::optimize()
関数を使用していないことが分かりました。これはむしろ私を驚かせました。
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
を排除します:
は、より一般的には、コンパイラは、以下の例ではf2 = -f1
ことを認識するだろうか?
私はMSVCコンパイラを使用していますが、すべて同じことをすると思います。