Average Error: 12.5 → 0.6
Time: 3.5s
Precision: 64
\[\frac{x \cdot \left(y + z\right)}{z}\]
\[\begin{array}{l} \mathbf{if}\;\frac{x \cdot \left(y + z\right)}{z} = -\infty \lor \neg \left(\frac{x \cdot \left(y + z\right)}{z} \le -2.0930321799833828 \cdot 10^{-4} \lor \neg \left(\frac{x \cdot \left(y + z\right)}{z} \le 1.2379612958139637 \cdot 10^{-67} \lor \neg \left(\frac{x \cdot \left(y + z\right)}{z} \le 2.59072917384724201 \cdot 10^{244}\right)\right)\right):\\ \;\;\;\;\mathsf{fma}\left(\frac{y}{z}, x, x\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{x \cdot \left(y + z\right)}{z}\\ \end{array}\]
\frac{x \cdot \left(y + z\right)}{z}
\begin{array}{l}
\mathbf{if}\;\frac{x \cdot \left(y + z\right)}{z} = -\infty \lor \neg \left(\frac{x \cdot \left(y + z\right)}{z} \le -2.0930321799833828 \cdot 10^{-4} \lor \neg \left(\frac{x \cdot \left(y + z\right)}{z} \le 1.2379612958139637 \cdot 10^{-67} \lor \neg \left(\frac{x \cdot \left(y + z\right)}{z} \le 2.59072917384724201 \cdot 10^{244}\right)\right)\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{y}{z}, x, x\right)\\

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

\end{array}
double f(double x, double y, double z) {
        double r379959 = x;
        double r379960 = y;
        double r379961 = z;
        double r379962 = r379960 + r379961;
        double r379963 = r379959 * r379962;
        double r379964 = r379963 / r379961;
        return r379964;
}

double f(double x, double y, double z) {
        double r379965 = x;
        double r379966 = y;
        double r379967 = z;
        double r379968 = r379966 + r379967;
        double r379969 = r379965 * r379968;
        double r379970 = r379969 / r379967;
        double r379971 = -inf.0;
        bool r379972 = r379970 <= r379971;
        double r379973 = -0.00020930321799833828;
        bool r379974 = r379970 <= r379973;
        double r379975 = 1.2379612958139637e-67;
        bool r379976 = r379970 <= r379975;
        double r379977 = 2.590729173847242e+244;
        bool r379978 = r379970 <= r379977;
        double r379979 = !r379978;
        bool r379980 = r379976 || r379979;
        double r379981 = !r379980;
        bool r379982 = r379974 || r379981;
        double r379983 = !r379982;
        bool r379984 = r379972 || r379983;
        double r379985 = r379966 / r379967;
        double r379986 = fma(r379985, r379965, r379965);
        double r379987 = r379984 ? r379986 : r379970;
        return r379987;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original12.5
Target2.9
Herbie0.6
\[\frac{x}{\frac{z}{y + z}}\]

Derivation

  1. Split input into 2 regimes
  2. if (/ (* x (+ y z)) z) < -inf.0 or -0.00020930321799833828 < (/ (* x (+ y z)) z) < 1.2379612958139637e-67 or 2.590729173847242e+244 < (/ (* x (+ y z)) z)

    1. Initial program 22.4

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

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

    if -inf.0 < (/ (* x (+ y z)) z) < -0.00020930321799833828 or 1.2379612958139637e-67 < (/ (* x (+ y z)) z) < 2.590729173847242e+244

    1. Initial program 0.3

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{x \cdot \left(y + z\right)}{z} = -\infty \lor \neg \left(\frac{x \cdot \left(y + z\right)}{z} \le -2.0930321799833828 \cdot 10^{-4} \lor \neg \left(\frac{x \cdot \left(y + z\right)}{z} \le 1.2379612958139637 \cdot 10^{-67} \lor \neg \left(\frac{x \cdot \left(y + z\right)}{z} \le 2.59072917384724201 \cdot 10^{244}\right)\right)\right):\\ \;\;\;\;\mathsf{fma}\left(\frac{y}{z}, x, x\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{x \cdot \left(y + z\right)}{z}\\ \end{array}\]

Reproduce

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

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

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