Average Error: 9.8 → 0.7
Time: 17.5s
Precision: 64
\[\frac{x \cdot \left(\left(y - z\right) + 1.0\right)}{z}\]
\[\begin{array}{l} \mathbf{if}\;x \le -148408012023565.47:\\ \;\;\;\;\mathsf{fma}\left(1.0, \frac{x}{z}, \frac{y}{z} \cdot x - x\right)\\ \mathbf{elif}\;x \le 1.4441879214959917 \cdot 10^{-288}:\\ \;\;\;\;\frac{\left(1.0 + y\right) \cdot x}{z} - x\\ \mathbf{else}:\\ \;\;\;\;\frac{x}{z} \cdot \left(1.0 + y\right) - x\\ \end{array}\]
\frac{x \cdot \left(\left(y - z\right) + 1.0\right)}{z}
\begin{array}{l}
\mathbf{if}\;x \le -148408012023565.47:\\
\;\;\;\;\mathsf{fma}\left(1.0, \frac{x}{z}, \frac{y}{z} \cdot x - x\right)\\

\mathbf{elif}\;x \le 1.4441879214959917 \cdot 10^{-288}:\\
\;\;\;\;\frac{\left(1.0 + y\right) \cdot x}{z} - x\\

\mathbf{else}:\\
\;\;\;\;\frac{x}{z} \cdot \left(1.0 + y\right) - x\\

\end{array}
double f(double x, double y, double z) {
        double r29933409 = x;
        double r29933410 = y;
        double r29933411 = z;
        double r29933412 = r29933410 - r29933411;
        double r29933413 = 1.0;
        double r29933414 = r29933412 + r29933413;
        double r29933415 = r29933409 * r29933414;
        double r29933416 = r29933415 / r29933411;
        return r29933416;
}

double f(double x, double y, double z) {
        double r29933417 = x;
        double r29933418 = -148408012023565.47;
        bool r29933419 = r29933417 <= r29933418;
        double r29933420 = 1.0;
        double r29933421 = z;
        double r29933422 = r29933417 / r29933421;
        double r29933423 = y;
        double r29933424 = r29933423 / r29933421;
        double r29933425 = r29933424 * r29933417;
        double r29933426 = r29933425 - r29933417;
        double r29933427 = fma(r29933420, r29933422, r29933426);
        double r29933428 = 1.4441879214959917e-288;
        bool r29933429 = r29933417 <= r29933428;
        double r29933430 = r29933420 + r29933423;
        double r29933431 = r29933430 * r29933417;
        double r29933432 = r29933431 / r29933421;
        double r29933433 = r29933432 - r29933417;
        double r29933434 = r29933422 * r29933430;
        double r29933435 = r29933434 - r29933417;
        double r29933436 = r29933429 ? r29933433 : r29933435;
        double r29933437 = r29933419 ? r29933427 : r29933436;
        return r29933437;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original9.8
Target0.5
Herbie0.7
\[\begin{array}{l} \mathbf{if}\;x \lt -2.71483106713436 \cdot 10^{-162}:\\ \;\;\;\;\left(1 + y\right) \cdot \frac{x}{z} - x\\ \mathbf{elif}\;x \lt 3.874108816439546 \cdot 10^{-197}:\\ \;\;\;\;\left(x \cdot \left(\left(y - z\right) + 1.0\right)\right) \cdot \frac{1}{z}\\ \mathbf{else}:\\ \;\;\;\;\left(1 + y\right) \cdot \frac{x}{z} - x\\ \end{array}\]

Derivation

  1. Split input into 3 regimes
  2. if x < -148408012023565.47

    1. Initial program 25.3

      \[\frac{x \cdot \left(\left(y - z\right) + 1.0\right)}{z}\]
    2. Taylor expanded around 0 8.9

      \[\leadsto \color{blue}{\left(\frac{x \cdot y}{z} + 1.0 \cdot \frac{x}{z}\right) - x}\]
    3. Simplified0.1

      \[\leadsto \color{blue}{\mathsf{fma}\left(1.0, \frac{x}{z}, \frac{y}{z} \cdot x - x\right)}\]

    if -148408012023565.47 < x < 1.4441879214959917e-288

    1. Initial program 0.2

      \[\frac{x \cdot \left(\left(y - z\right) + 1.0\right)}{z}\]
    2. Taylor expanded around 0 0.1

      \[\leadsto \color{blue}{\left(\frac{x \cdot y}{z} + 1.0 \cdot \frac{x}{z}\right) - x}\]
    3. Simplified5.3

      \[\leadsto \color{blue}{\mathsf{fma}\left(1.0, \frac{x}{z}, \frac{y}{z} \cdot x - x\right)}\]
    4. Using strategy rm
    5. Applied div-inv5.4

      \[\leadsto \mathsf{fma}\left(1.0, \frac{x}{z}, \color{blue}{\left(y \cdot \frac{1}{z}\right)} \cdot x - x\right)\]
    6. Applied associate-*l*3.2

      \[\leadsto \mathsf{fma}\left(1.0, \frac{x}{z}, \color{blue}{y \cdot \left(\frac{1}{z} \cdot x\right)} - x\right)\]
    7. Simplified3.1

      \[\leadsto \mathsf{fma}\left(1.0, \frac{x}{z}, y \cdot \color{blue}{\frac{x}{z}} - x\right)\]
    8. Taylor expanded around 0 0.1

      \[\leadsto \color{blue}{\left(\frac{x \cdot y}{z} + 1.0 \cdot \frac{x}{z}\right) - x}\]
    9. Simplified3.1

      \[\leadsto \color{blue}{\frac{x}{z} \cdot \left(y + 1.0\right) - x}\]
    10. Using strategy rm
    11. Applied associate-*l/0.1

      \[\leadsto \color{blue}{\frac{x \cdot \left(y + 1.0\right)}{z}} - x\]

    if 1.4441879214959917e-288 < x

    1. Initial program 10.4

      \[\frac{x \cdot \left(\left(y - z\right) + 1.0\right)}{z}\]
    2. Taylor expanded around 0 3.5

      \[\leadsto \color{blue}{\left(\frac{x \cdot y}{z} + 1.0 \cdot \frac{x}{z}\right) - x}\]
    3. Simplified3.2

      \[\leadsto \color{blue}{\mathsf{fma}\left(1.0, \frac{x}{z}, \frac{y}{z} \cdot x - x\right)}\]
    4. Using strategy rm
    5. Applied div-inv3.2

      \[\leadsto \mathsf{fma}\left(1.0, \frac{x}{z}, \color{blue}{\left(y \cdot \frac{1}{z}\right)} \cdot x - x\right)\]
    6. Applied associate-*l*1.4

      \[\leadsto \mathsf{fma}\left(1.0, \frac{x}{z}, \color{blue}{y \cdot \left(\frac{1}{z} \cdot x\right)} - x\right)\]
    7. Simplified1.4

      \[\leadsto \mathsf{fma}\left(1.0, \frac{x}{z}, y \cdot \color{blue}{\frac{x}{z}} - x\right)\]
    8. Taylor expanded around 0 3.5

      \[\leadsto \color{blue}{\left(\frac{x \cdot y}{z} + 1.0 \cdot \frac{x}{z}\right) - x}\]
    9. Simplified1.4

      \[\leadsto \color{blue}{\frac{x}{z} \cdot \left(y + 1.0\right) - x}\]
  3. Recombined 3 regimes into one program.
  4. Final simplification0.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -148408012023565.47:\\ \;\;\;\;\mathsf{fma}\left(1.0, \frac{x}{z}, \frac{y}{z} \cdot x - x\right)\\ \mathbf{elif}\;x \le 1.4441879214959917 \cdot 10^{-288}:\\ \;\;\;\;\frac{\left(1.0 + y\right) \cdot x}{z} - x\\ \mathbf{else}:\\ \;\;\;\;\frac{x}{z} \cdot \left(1.0 + y\right) - x\\ \end{array}\]

Reproduce

herbie shell --seed 2019163 +o rules:numerics
(FPCore (x y z)
  :name "Diagrams.TwoD.Segment.Bernstein:evaluateBernstein from diagrams-lib-1.3.0.3"

  :herbie-target
  (if (< x -2.71483106713436e-162) (- (* (+ 1 y) (/ x z)) x) (if (< x 3.874108816439546e-197) (* (* x (+ (- y z) 1.0)) (/ 1 z)) (- (* (+ 1 y) (/ x z)) x)))

  (/ (* x (+ (- y z) 1.0)) z))