Average Error: 57.9 → 0.5
Time: 1.4m
Precision: 64
\[\left(0.5 \cdot \cos re\right) \cdot \left(e^{0 - im} - e^{im}\right)\]
\[\begin{array}{l} \mathbf{if}\;\left(0.5 \cdot \cos re\right) \cdot \left(e^{-im} - e^{im}\right) \le 1.6380449607278358 \cdot 10^{-06}:\\ \;\;\;\;\left(\cos re \cdot \left(-2 \cdot 0.5\right)\right) \cdot im - \cos re \cdot (\left({im}^{5}\right) \cdot 0.008333333333333333 + \left(\left(im \cdot 0.16666666666666666\right) \cdot \left(im \cdot im\right)\right))_*\\ \mathbf{else}:\\ \;\;\;\;\left(\left(0.5 \cdot \cos re\right) \cdot \left(\sqrt{e^{-im}} + \sqrt{e^{im}}\right)\right) \cdot \left(\sqrt{e^{-im}} - \sqrt{e^{im}}\right)\\ \end{array}\]
\left(0.5 \cdot \cos re\right) \cdot \left(e^{0 - im} - e^{im}\right)
\begin{array}{l}
\mathbf{if}\;\left(0.5 \cdot \cos re\right) \cdot \left(e^{-im} - e^{im}\right) \le 1.6380449607278358 \cdot 10^{-06}:\\
\;\;\;\;\left(\cos re \cdot \left(-2 \cdot 0.5\right)\right) \cdot im - \cos re \cdot (\left({im}^{5}\right) \cdot 0.008333333333333333 + \left(\left(im \cdot 0.16666666666666666\right) \cdot \left(im \cdot im\right)\right))_*\\

\mathbf{else}:\\
\;\;\;\;\left(\left(0.5 \cdot \cos re\right) \cdot \left(\sqrt{e^{-im}} + \sqrt{e^{im}}\right)\right) \cdot \left(\sqrt{e^{-im}} - \sqrt{e^{im}}\right)\\

\end{array}
double f(double re, double im) {
        double r35231326 = 0.5;
        double r35231327 = re;
        double r35231328 = cos(r35231327);
        double r35231329 = r35231326 * r35231328;
        double r35231330 = 0.0;
        double r35231331 = im;
        double r35231332 = r35231330 - r35231331;
        double r35231333 = exp(r35231332);
        double r35231334 = exp(r35231331);
        double r35231335 = r35231333 - r35231334;
        double r35231336 = r35231329 * r35231335;
        return r35231336;
}

double f(double re, double im) {
        double r35231337 = 0.5;
        double r35231338 = re;
        double r35231339 = cos(r35231338);
        double r35231340 = r35231337 * r35231339;
        double r35231341 = im;
        double r35231342 = -r35231341;
        double r35231343 = exp(r35231342);
        double r35231344 = exp(r35231341);
        double r35231345 = r35231343 - r35231344;
        double r35231346 = r35231340 * r35231345;
        double r35231347 = 1.6380449607278358e-06;
        bool r35231348 = r35231346 <= r35231347;
        double r35231349 = -2.0;
        double r35231350 = r35231349 * r35231337;
        double r35231351 = r35231339 * r35231350;
        double r35231352 = r35231351 * r35231341;
        double r35231353 = 5.0;
        double r35231354 = pow(r35231341, r35231353);
        double r35231355 = 0.008333333333333333;
        double r35231356 = 0.16666666666666666;
        double r35231357 = r35231341 * r35231356;
        double r35231358 = r35231341 * r35231341;
        double r35231359 = r35231357 * r35231358;
        double r35231360 = fma(r35231354, r35231355, r35231359);
        double r35231361 = r35231339 * r35231360;
        double r35231362 = r35231352 - r35231361;
        double r35231363 = sqrt(r35231343);
        double r35231364 = sqrt(r35231344);
        double r35231365 = r35231363 + r35231364;
        double r35231366 = r35231340 * r35231365;
        double r35231367 = r35231363 - r35231364;
        double r35231368 = r35231366 * r35231367;
        double r35231369 = r35231348 ? r35231362 : r35231368;
        return r35231369;
}

Error

Bits error versus re

Bits error versus im

Target

Original57.9
Target0.2
Herbie0.5
\[\begin{array}{l} \mathbf{if}\;\left|im\right| \lt 1:\\ \;\;\;\;-\cos re \cdot \left(\left(im + \left(\left(\frac{1}{6} \cdot im\right) \cdot im\right) \cdot im\right) + \left(\left(\left(\left(\frac{1}{120} \cdot im\right) \cdot im\right) \cdot im\right) \cdot im\right) \cdot im\right)\\ \mathbf{else}:\\ \;\;\;\;\left(0.5 \cdot \cos re\right) \cdot \left(e^{0 - im} - e^{im}\right)\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if (* (* 0.5 (cos re)) (- (exp (- 0 im)) (exp im))) < 1.6380449607278358e-06

    1. Initial program 58.7

      \[\left(0.5 \cdot \cos re\right) \cdot \left(e^{0 - im} - e^{im}\right)\]
    2. Taylor expanded around 0 0.4

      \[\leadsto \left(0.5 \cdot \cos re\right) \cdot \color{blue}{\left(-\left(\frac{1}{3} \cdot {im}^{3} + \left(\frac{1}{60} \cdot {im}^{5} + 2 \cdot im\right)\right)\right)}\]
    3. Simplified0.5

      \[\leadsto \left(0.5 \cdot \cos re\right) \cdot \color{blue}{(\left({im}^{5}\right) \cdot \frac{-1}{60} + \left(im \cdot \left(\left(im \cdot \frac{-1}{3}\right) \cdot im - 2\right)\right))_*}\]
    4. Using strategy rm
    5. Applied add-sqr-sqrt1.6

      \[\leadsto \left(0.5 \cdot \cos re\right) \cdot (\left({im}^{5}\right) \cdot \frac{-1}{60} + \left(im \cdot \left(\left(im \cdot \frac{-1}{3}\right) \cdot im - \color{blue}{\sqrt{2} \cdot \sqrt{2}}\right)\right))_*\]
    6. Applied prod-diff1.6

      \[\leadsto \left(0.5 \cdot \cos re\right) \cdot (\left({im}^{5}\right) \cdot \frac{-1}{60} + \left(im \cdot \color{blue}{\left((\left(im \cdot \frac{-1}{3}\right) \cdot im + \left(-\sqrt{2} \cdot \sqrt{2}\right))_* + (\left(-\sqrt{2}\right) \cdot \left(\sqrt{2}\right) + \left(\sqrt{2} \cdot \sqrt{2}\right))_*\right)}\right))_*\]
    7. Applied distribute-rgt-in1.1

      \[\leadsto \left(0.5 \cdot \cos re\right) \cdot (\left({im}^{5}\right) \cdot \frac{-1}{60} + \color{blue}{\left((\left(im \cdot \frac{-1}{3}\right) \cdot im + \left(-\sqrt{2} \cdot \sqrt{2}\right))_* \cdot im + (\left(-\sqrt{2}\right) \cdot \left(\sqrt{2}\right) + \left(\sqrt{2} \cdot \sqrt{2}\right))_* \cdot im\right)})_*\]
    8. Simplified1.6

      \[\leadsto \left(0.5 \cdot \cos re\right) \cdot (\left({im}^{5}\right) \cdot \frac{-1}{60} + \left((\left(im \cdot \frac{-1}{3}\right) \cdot im + \left(-\sqrt{2} \cdot \sqrt{2}\right))_* \cdot im + \color{blue}{0}\right))_*\]
    9. Taylor expanded around inf 1.6

      \[\leadsto \color{blue}{-\left(0.5 \cdot \left({\left(\sqrt{2}\right)}^{2} \cdot \left(im \cdot \cos re\right)\right) + \left(0.16666666666666666 \cdot \left({im}^{3} \cdot \cos re\right) + 0.008333333333333333 \cdot \left({im}^{5} \cdot \cos re\right)\right)\right)}\]
    10. Simplified0.4

      \[\leadsto \color{blue}{\left(\left(-2 \cdot 0.5\right) \cdot \cos re\right) \cdot im - (\left({im}^{5}\right) \cdot 0.008333333333333333 + \left(\left(im \cdot 0.16666666666666666\right) \cdot \left(im \cdot im\right)\right))_* \cdot \cos re}\]

    if 1.6380449607278358e-06 < (* (* 0.5 (cos re)) (- (exp (- 0 im)) (exp im)))

    1. Initial program 4.8

      \[\left(0.5 \cdot \cos re\right) \cdot \left(e^{0 - im} - e^{im}\right)\]
    2. Using strategy rm
    3. Applied add-sqr-sqrt5.3

      \[\leadsto \left(0.5 \cdot \cos re\right) \cdot \left(e^{0 - im} - \color{blue}{\sqrt{e^{im}} \cdot \sqrt{e^{im}}}\right)\]
    4. Applied add-sqr-sqrt5.7

      \[\leadsto \left(0.5 \cdot \cos re\right) \cdot \left(\color{blue}{\sqrt{e^{0 - im}} \cdot \sqrt{e^{0 - im}}} - \sqrt{e^{im}} \cdot \sqrt{e^{im}}\right)\]
    5. Applied difference-of-squares5.7

      \[\leadsto \left(0.5 \cdot \cos re\right) \cdot \color{blue}{\left(\left(\sqrt{e^{0 - im}} + \sqrt{e^{im}}\right) \cdot \left(\sqrt{e^{0 - im}} - \sqrt{e^{im}}\right)\right)}\]
    6. Applied associate-*r*5.7

      \[\leadsto \color{blue}{\left(\left(0.5 \cdot \cos re\right) \cdot \left(\sqrt{e^{0 - im}} + \sqrt{e^{im}}\right)\right) \cdot \left(\sqrt{e^{0 - im}} - \sqrt{e^{im}}\right)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.5

    \[\leadsto \begin{array}{l} \mathbf{if}\;\left(0.5 \cdot \cos re\right) \cdot \left(e^{-im} - e^{im}\right) \le 1.6380449607278358 \cdot 10^{-06}:\\ \;\;\;\;\left(\cos re \cdot \left(-2 \cdot 0.5\right)\right) \cdot im - \cos re \cdot (\left({im}^{5}\right) \cdot 0.008333333333333333 + \left(\left(im \cdot 0.16666666666666666\right) \cdot \left(im \cdot im\right)\right))_*\\ \mathbf{else}:\\ \;\;\;\;\left(\left(0.5 \cdot \cos re\right) \cdot \left(\sqrt{e^{-im}} + \sqrt{e^{im}}\right)\right) \cdot \left(\sqrt{e^{-im}} - \sqrt{e^{im}}\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019107 +o rules:numerics
(FPCore (re im)
  :name "math.sin on complex, imaginary part"

  :herbie-target
  (if (< (fabs im) 1) (- (* (cos re) (+ (+ im (* (* (* 1/6 im) im) im)) (* (* (* (* (* 1/120 im) im) im) im) im)))) (* (* 0.5 (cos re)) (- (exp (- 0 im)) (exp im))))

  (* (* 0.5 (cos re)) (- (exp (- 0 im)) (exp im))))