Average Error: 10.2 → 0.7
Time: 20.5s
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 r27481008 = x;
        double r27481009 = y;
        double r27481010 = z;
        double r27481011 = r27481009 - r27481010;
        double r27481012 = 1.0;
        double r27481013 = r27481011 + r27481012;
        double r27481014 = r27481008 * r27481013;
        double r27481015 = r27481014 / r27481010;
        return r27481015;
}

double f(double x, double y, double z) {
        double r27481016 = x;
        double r27481017 = -5.5666437058214586e-149;
        bool r27481018 = r27481016 <= r27481017;
        double r27481019 = z;
        double r27481020 = y;
        double r27481021 = r27481020 - r27481019;
        double r27481022 = 1.0;
        double r27481023 = r27481021 + r27481022;
        double r27481024 = r27481019 / r27481023;
        double r27481025 = r27481016 / r27481024;
        double r27481026 = 6.501322699678815e-163;
        bool r27481027 = r27481016 <= r27481026;
        double r27481028 = r27481023 * r27481016;
        double r27481029 = 1.0;
        double r27481030 = r27481029 / r27481019;
        double r27481031 = r27481028 * r27481030;
        double r27481032 = r27481016 / r27481019;
        double r27481033 = r27481022 * r27481032;
        double r27481034 = r27481033 - r27481016;
        double r27481035 = fma(r27481032, r27481020, r27481034);
        double r27481036 = r27481027 ? r27481031 : r27481035;
        double r27481037 = r27481018 ? r27481025 : r27481036;
        return r27481037;
}

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 *-un-lft-identity0.2

      \[\leadsto \frac{x \cdot \left(\left(y - z\right) + 1\right)}{\color{blue}{1 \cdot z}}\]
    4. Applied times-frac7.9

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

      \[\leadsto \color{blue}{x} \cdot \frac{\left(y - z\right) + 1}{z}\]
    6. Using strategy rm
    7. Applied div-inv8.0

      \[\leadsto x \cdot \color{blue}{\left(\left(\left(y - z\right) + 1\right) \cdot \frac{1}{z}\right)}\]
    8. Applied associate-*r*0.3

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

    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))