Average Error: 10.1 → 0.2
Time: 3.3s
Precision: 64
\[\frac{x \cdot \left(\left(y - z\right) + 1\right)}{z}\]
\[\begin{array}{l} \mathbf{if}\;z \le -3.26172555651194866 \cdot 10^{69} \lor \neg \left(z \le 1.04217124031497941 \cdot 10^{38}\right):\\ \;\;\;\;\mathsf{fma}\left(1, \frac{x}{z}, \frac{x}{\frac{z}{y}}\right) - x\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(1, \frac{x}{z}, \frac{x \cdot y}{z}\right) - x\\ \end{array}\]
\frac{x \cdot \left(\left(y - z\right) + 1\right)}{z}
\begin{array}{l}
\mathbf{if}\;z \le -3.26172555651194866 \cdot 10^{69} \lor \neg \left(z \le 1.04217124031497941 \cdot 10^{38}\right):\\
\;\;\;\;\mathsf{fma}\left(1, \frac{x}{z}, \frac{x}{\frac{z}{y}}\right) - x\\

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

\end{array}
double f(double x, double y, double z) {
        double r776161 = x;
        double r776162 = y;
        double r776163 = z;
        double r776164 = r776162 - r776163;
        double r776165 = 1.0;
        double r776166 = r776164 + r776165;
        double r776167 = r776161 * r776166;
        double r776168 = r776167 / r776163;
        return r776168;
}

double f(double x, double y, double z) {
        double r776169 = z;
        double r776170 = -3.2617255565119487e+69;
        bool r776171 = r776169 <= r776170;
        double r776172 = 1.0421712403149794e+38;
        bool r776173 = r776169 <= r776172;
        double r776174 = !r776173;
        bool r776175 = r776171 || r776174;
        double r776176 = 1.0;
        double r776177 = x;
        double r776178 = r776177 / r776169;
        double r776179 = y;
        double r776180 = r776169 / r776179;
        double r776181 = r776177 / r776180;
        double r776182 = fma(r776176, r776178, r776181);
        double r776183 = r776182 - r776177;
        double r776184 = r776177 * r776179;
        double r776185 = r776184 / r776169;
        double r776186 = fma(r776176, r776178, r776185);
        double r776187 = r776186 - r776177;
        double r776188 = r776175 ? r776183 : r776187;
        return r776188;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original10.1
Target0.5
Herbie0.2
\[\begin{array}{l} \mathbf{if}\;x \lt -2.7148310671343599 \cdot 10^{-162}:\\ \;\;\;\;\left(1 + y\right) \cdot \frac{x}{z} - x\\ \mathbf{elif}\;x \lt 3.87410881643954616 \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 2 regimes
  2. if z < -3.2617255565119487e+69 or 1.0421712403149794e+38 < z

    1. Initial program 19.5

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

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

      \[\leadsto \color{blue}{\mathsf{fma}\left(1, \frac{x}{z}, \frac{x \cdot y}{z}\right) - x}\]
    4. Using strategy rm
    5. Applied associate-/l*0.1

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

    if -3.2617255565119487e+69 < z < 1.0421712403149794e+38

    1. Initial program 0.6

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

      \[\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(1, \frac{x}{z}, \frac{x \cdot y}{z}\right) - x}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.2

    \[\leadsto \begin{array}{l} \mathbf{if}\;z \le -3.26172555651194866 \cdot 10^{69} \lor \neg \left(z \le 1.04217124031497941 \cdot 10^{38}\right):\\ \;\;\;\;\mathsf{fma}\left(1, \frac{x}{z}, \frac{x}{\frac{z}{y}}\right) - x\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(1, \frac{x}{z}, \frac{x \cdot y}{z}\right) - x\\ \end{array}\]

Reproduce

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

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

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