Average Error: 9.9 → 0.2
Time: 13.2s
Precision: 64
\[\frac{x \cdot \left(\left(y - z\right) + 1\right)}{z}\]
\[\begin{array}{l} \mathbf{if}\;x \le -1.126216460909622877236823923932130470222 \cdot 10^{-93} \lor \neg \left(x \le 2.965280437514699901782946893938156186351 \cdot 10^{-86}\right):\\ \;\;\;\;\mathsf{fma}\left(\frac{x}{z}, y, \frac{x \cdot 1}{z} - x\right)\\ \mathbf{else}:\\ \;\;\;\;\left(x \cdot \left(1 + \left(y - z\right)\right)\right) \cdot \frac{1}{z}\\ \end{array}\]
\frac{x \cdot \left(\left(y - z\right) + 1\right)}{z}
\begin{array}{l}
\mathbf{if}\;x \le -1.126216460909622877236823923932130470222 \cdot 10^{-93} \lor \neg \left(x \le 2.965280437514699901782946893938156186351 \cdot 10^{-86}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{x}{z}, y, \frac{x \cdot 1}{z} - x\right)\\

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

\end{array}
double f(double x, double y, double z) {
        double r563692 = x;
        double r563693 = y;
        double r563694 = z;
        double r563695 = r563693 - r563694;
        double r563696 = 1.0;
        double r563697 = r563695 + r563696;
        double r563698 = r563692 * r563697;
        double r563699 = r563698 / r563694;
        return r563699;
}

double f(double x, double y, double z) {
        double r563700 = x;
        double r563701 = -1.1262164609096229e-93;
        bool r563702 = r563700 <= r563701;
        double r563703 = 2.9652804375147e-86;
        bool r563704 = r563700 <= r563703;
        double r563705 = !r563704;
        bool r563706 = r563702 || r563705;
        double r563707 = z;
        double r563708 = r563700 / r563707;
        double r563709 = y;
        double r563710 = 1.0;
        double r563711 = r563700 * r563710;
        double r563712 = r563711 / r563707;
        double r563713 = r563712 - r563700;
        double r563714 = fma(r563708, r563709, r563713);
        double r563715 = r563709 - r563707;
        double r563716 = r563710 + r563715;
        double r563717 = r563700 * r563716;
        double r563718 = 1.0;
        double r563719 = r563718 / r563707;
        double r563720 = r563717 * r563719;
        double r563721 = r563706 ? r563714 : r563720;
        return r563721;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original9.9
Target0.5
Herbie0.2
\[\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 2 regimes
  2. if x < -1.1262164609096229e-93 or 2.9652804375147e-86 < x

    1. Initial program 17.5

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

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

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

    if -1.1262164609096229e-93 < x < 2.9652804375147e-86

    1. Initial program 0.2

      \[\frac{x \cdot \left(\left(y - z\right) + 1\right)}{z}\]
    2. Using strategy rm
    3. Applied div-inv0.3

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -1.126216460909622877236823923932130470222 \cdot 10^{-93} \lor \neg \left(x \le 2.965280437514699901782946893938156186351 \cdot 10^{-86}\right):\\ \;\;\;\;\mathsf{fma}\left(\frac{x}{z}, y, \frac{x \cdot 1}{z} - x\right)\\ \mathbf{else}:\\ \;\;\;\;\left(x \cdot \left(1 + \left(y - z\right)\right)\right) \cdot \frac{1}{z}\\ \end{array}\]

Reproduce

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