Average Error: 10.5 → 0.5
Time: 39.7s
Precision: 64
\[\frac{x \cdot \left(\left(y - z\right) + 1.0\right)}{z}\]
\[\begin{array}{l} \mathbf{if}\;x \le -7.814855256918435 \cdot 10^{-142}:\\ \;\;\;\;\mathsf{fma}\left(\frac{x}{z}, 1.0, y \cdot \frac{x}{z}\right) - x\\ \mathbf{elif}\;x \le 3.0983310819560493 \cdot 10^{-110}:\\ \;\;\;\;\frac{1}{z} \cdot \left(\left(1.0 + \left(y - z\right)\right) \cdot x\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{x}{\frac{z}{1.0 + \left(y - z\right)}}\\ \end{array}\]
\frac{x \cdot \left(\left(y - z\right) + 1.0\right)}{z}
\begin{array}{l}
\mathbf{if}\;x \le -7.814855256918435 \cdot 10^{-142}:\\
\;\;\;\;\mathsf{fma}\left(\frac{x}{z}, 1.0, y \cdot \frac{x}{z}\right) - x\\

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

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

\end{array}
double f(double x, double y, double z) {
        double r30463056 = x;
        double r30463057 = y;
        double r30463058 = z;
        double r30463059 = r30463057 - r30463058;
        double r30463060 = 1.0;
        double r30463061 = r30463059 + r30463060;
        double r30463062 = r30463056 * r30463061;
        double r30463063 = r30463062 / r30463058;
        return r30463063;
}

double f(double x, double y, double z) {
        double r30463064 = x;
        double r30463065 = -7.814855256918435e-142;
        bool r30463066 = r30463064 <= r30463065;
        double r30463067 = z;
        double r30463068 = r30463064 / r30463067;
        double r30463069 = 1.0;
        double r30463070 = y;
        double r30463071 = r30463070 * r30463068;
        double r30463072 = fma(r30463068, r30463069, r30463071);
        double r30463073 = r30463072 - r30463064;
        double r30463074 = 3.0983310819560493e-110;
        bool r30463075 = r30463064 <= r30463074;
        double r30463076 = 1.0;
        double r30463077 = r30463076 / r30463067;
        double r30463078 = r30463070 - r30463067;
        double r30463079 = r30463069 + r30463078;
        double r30463080 = r30463079 * r30463064;
        double r30463081 = r30463077 * r30463080;
        double r30463082 = r30463067 / r30463079;
        double r30463083 = r30463064 / r30463082;
        double r30463084 = r30463075 ? r30463081 : r30463083;
        double r30463085 = r30463066 ? r30463073 : r30463084;
        return r30463085;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original10.5
Target0.4
Herbie0.5
\[\begin{array}{l} \mathbf{if}\;x \lt -2.71483106713436 \cdot 10^{-162}:\\ \;\;\;\;\left(1.0 + 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.0}{z}\\ \mathbf{else}:\\ \;\;\;\;\left(1.0 + y\right) \cdot \frac{x}{z} - x\\ \end{array}\]

Derivation

  1. Split input into 3 regimes
  2. if x < -7.814855256918435e-142

    1. Initial program 15.7

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

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

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

    if -7.814855256918435e-142 < x < 3.0983310819560493e-110

    1. Initial program 0.2

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

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

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

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

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

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

    if 3.0983310819560493e-110 < x

    1. Initial program 17.5

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

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

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

Reproduce

herbie shell --seed 2019165 +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))