Average Error: 12.5 → 2.2
Time: 12.3s
Precision: 64
\[\frac{x \cdot \left(y + z\right)}{z}\]
\[\begin{array}{l} \mathbf{if}\;y \le -441043790187128906842112 \lor \neg \left(y \le 3.330476111612473560474090169466101556088 \cdot 10^{-167}\right):\\ \;\;\;\;\mathsf{fma}\left(\frac{x}{z}, y, x\right)\\ \mathbf{else}:\\ \;\;\;\;x \cdot \frac{y}{z} + x\\ \end{array}\]
\frac{x \cdot \left(y + z\right)}{z}
\begin{array}{l}
\mathbf{if}\;y \le -441043790187128906842112 \lor \neg \left(y \le 3.330476111612473560474090169466101556088 \cdot 10^{-167}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{x}{z}, y, x\right)\\

\mathbf{else}:\\
\;\;\;\;x \cdot \frac{y}{z} + x\\

\end{array}
double f(double x, double y, double z) {
        double r327552 = x;
        double r327553 = y;
        double r327554 = z;
        double r327555 = r327553 + r327554;
        double r327556 = r327552 * r327555;
        double r327557 = r327556 / r327554;
        return r327557;
}

double f(double x, double y, double z) {
        double r327558 = y;
        double r327559 = -4.410437901871289e+23;
        bool r327560 = r327558 <= r327559;
        double r327561 = 3.3304761116124736e-167;
        bool r327562 = r327558 <= r327561;
        double r327563 = !r327562;
        bool r327564 = r327560 || r327563;
        double r327565 = x;
        double r327566 = z;
        double r327567 = r327565 / r327566;
        double r327568 = fma(r327567, r327558, r327565);
        double r327569 = r327558 / r327566;
        double r327570 = r327565 * r327569;
        double r327571 = r327570 + r327565;
        double r327572 = r327564 ? r327568 : r327571;
        return r327572;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original12.5
Target3.1
Herbie2.2
\[\frac{x}{\frac{z}{y + z}}\]

Derivation

  1. Split input into 2 regimes
  2. if y < -4.410437901871289e+23 or 3.3304761116124736e-167 < y

    1. Initial program 12.0

      \[\frac{x \cdot \left(y + z\right)}{z}\]
    2. Simplified3.8

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

    if -4.410437901871289e+23 < y < 3.3304761116124736e-167

    1. Initial program 13.1

      \[\frac{x \cdot \left(y + z\right)}{z}\]
    2. Simplified6.4

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{x}{z}, y, x\right)}\]
    3. Using strategy rm
    4. Applied fma-udef6.4

      \[\leadsto \color{blue}{\frac{x}{z} \cdot y + x}\]
    5. Simplified0.1

      \[\leadsto \color{blue}{\frac{x}{\frac{z}{y}}} + x\]
    6. Using strategy rm
    7. Applied div-inv0.1

      \[\leadsto \color{blue}{x \cdot \frac{1}{\frac{z}{y}}} + x\]
    8. Simplified0.1

      \[\leadsto x \cdot \color{blue}{\frac{y}{z}} + x\]
  3. Recombined 2 regimes into one program.
  4. Final simplification2.2

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

Reproduce

herbie shell --seed 2019174 +o rules:numerics
(FPCore (x y z)
  :name "Numeric.SpecFunctions:choose from math-functions-0.1.5.2"

  :herbie-target
  (/ x (/ z (+ y z)))

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