Average Error: 10.2 → 0.7
Time: 19.0s
Precision: 64
\[\frac{x \cdot \left(\left(y - z\right) + 1\right)}{z}\]
\[\begin{array}{l} \mathbf{if}\;x \le -5.566643705821458561738054118661531424499 \cdot 10^{-149}:\\ \;\;\;\;\frac{x}{\frac{z}{\left(y - z\right) + 1}}\\ \mathbf{elif}\;x \le 6.501322699678815134539600341361465497568 \cdot 10^{-163}:\\ \;\;\;\;\left(\left(\left(y - z\right) + 1\right) \cdot x\right) \cdot \frac{1}{z}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\frac{x}{z}, y, 1 \cdot \frac{x}{z} - x\right)\\ \end{array}\]
\frac{x \cdot \left(\left(y - z\right) + 1\right)}{z}
\begin{array}{l}
\mathbf{if}\;x \le -5.566643705821458561738054118661531424499 \cdot 10^{-149}:\\
\;\;\;\;\frac{x}{\frac{z}{\left(y - z\right) + 1}}\\

\mathbf{elif}\;x \le 6.501322699678815134539600341361465497568 \cdot 10^{-163}:\\
\;\;\;\;\left(\left(\left(y - z\right) + 1\right) \cdot x\right) \cdot \frac{1}{z}\\

\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{x}{z}, y, 1 \cdot \frac{x}{z} - x\right)\\

\end{array}
double f(double x, double y, double z) {
        double r26684587 = x;
        double r26684588 = y;
        double r26684589 = z;
        double r26684590 = r26684588 - r26684589;
        double r26684591 = 1.0;
        double r26684592 = r26684590 + r26684591;
        double r26684593 = r26684587 * r26684592;
        double r26684594 = r26684593 / r26684589;
        return r26684594;
}

double f(double x, double y, double z) {
        double r26684595 = x;
        double r26684596 = -5.5666437058214586e-149;
        bool r26684597 = r26684595 <= r26684596;
        double r26684598 = z;
        double r26684599 = y;
        double r26684600 = r26684599 - r26684598;
        double r26684601 = 1.0;
        double r26684602 = r26684600 + r26684601;
        double r26684603 = r26684598 / r26684602;
        double r26684604 = r26684595 / r26684603;
        double r26684605 = 6.501322699678815e-163;
        bool r26684606 = r26684595 <= r26684605;
        double r26684607 = r26684602 * r26684595;
        double r26684608 = 1.0;
        double r26684609 = r26684608 / r26684598;
        double r26684610 = r26684607 * r26684609;
        double r26684611 = r26684595 / r26684598;
        double r26684612 = r26684601 * r26684611;
        double r26684613 = r26684612 - r26684595;
        double r26684614 = fma(r26684611, r26684599, r26684613);
        double r26684615 = r26684606 ? r26684610 : r26684614;
        double r26684616 = r26684597 ? r26684604 : r26684615;
        return r26684616;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original10.2
Target0.5
Herbie0.7
\[\begin{array}{l} \mathbf{if}\;x \lt -2.714831067134359919650240696134672137284 \cdot 10^{-162}:\\ \;\;\;\;\left(1 + y\right) \cdot \frac{x}{z} - x\\ \mathbf{elif}\;x \lt 3.874108816439546156869494499878029491333 \cdot 10^{-197}:\\ \;\;\;\;\left(x \cdot \left(\left(y - z\right) + 1\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 < -5.5666437058214586e-149

    1. Initial program 15.1

      \[\frac{x \cdot \left(\left(y - z\right) + 1\right)}{z}\]
    2. Using strategy rm
    3. Applied associate-/l*1.3

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

    if -5.5666437058214586e-149 < x < 6.501322699678815e-163

    1. Initial program 0.2

      \[\frac{x \cdot \left(\left(y - z\right) + 1\right)}{z}\]
    2. Using strategy rm
    3. Applied associate-/l*7.3

      \[\leadsto \color{blue}{\frac{x}{\frac{z}{\left(y - z\right) + 1}}}\]
    4. Using strategy rm
    5. Applied div-inv7.4

      \[\leadsto \frac{x}{\color{blue}{z \cdot \frac{1}{\left(y - z\right) + 1}}}\]
    6. Applied *-un-lft-identity7.4

      \[\leadsto \frac{\color{blue}{1 \cdot x}}{z \cdot \frac{1}{\left(y - z\right) + 1}}\]
    7. Applied times-frac0.3

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

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

    if 6.501322699678815e-163 < x

    1. Initial program 14.2

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -5.566643705821458561738054118661531424499 \cdot 10^{-149}:\\ \;\;\;\;\frac{x}{\frac{z}{\left(y - z\right) + 1}}\\ \mathbf{elif}\;x \le 6.501322699678815134539600341361465497568 \cdot 10^{-163}:\\ \;\;\;\;\left(\left(\left(y - z\right) + 1\right) \cdot x\right) \cdot \frac{1}{z}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\frac{x}{z}, y, 1 \cdot \frac{x}{z} - x\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019172 +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.0 y) (/ x z)) x) (if (< x 3.874108816439546e-197) (* (* x (+ (- y z) 1.0)) (/ 1.0 z)) (- (* (+ 1.0 y) (/ x z)) x)))

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