Average Error: 19.8 → 0.2
Time: 19.1s
Precision: 64
\[x + \frac{y \cdot \left(\left(z \cdot 0.0692910599291889 + 0.4917317610505968\right) \cdot z + 0.279195317918525\right)}{\left(z + 6.012459259764103\right) \cdot z + 3.350343815022304}\]
\[\begin{array}{l} \mathbf{if}\;z \le -6.09488690648802 \cdot 10^{+42}:\\ \;\;\;\;\mathsf{fma}\left(0.0692910599291889, y, \mathsf{fma}\left(\frac{y}{z}, 0.07512208616047561, x\right)\right)\\ \mathbf{elif}\;z \le 172322047.23901248:\\ \;\;\;\;x + \frac{y \cdot \left(z \cdot \left(0.0692910599291889 \cdot z + 0.4917317610505968\right) + 0.279195317918525\right)}{3.350343815022304 + z \cdot \left(z + 6.012459259764103\right)}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(0.0692910599291889, y, \mathsf{fma}\left(\frac{y}{z}, 0.07512208616047561, x\right)\right)\\ \end{array}\]
x + \frac{y \cdot \left(\left(z \cdot 0.0692910599291889 + 0.4917317610505968\right) \cdot z + 0.279195317918525\right)}{\left(z + 6.012459259764103\right) \cdot z + 3.350343815022304}
\begin{array}{l}
\mathbf{if}\;z \le -6.09488690648802 \cdot 10^{+42}:\\
\;\;\;\;\mathsf{fma}\left(0.0692910599291889, y, \mathsf{fma}\left(\frac{y}{z}, 0.07512208616047561, x\right)\right)\\

\mathbf{elif}\;z \le 172322047.23901248:\\
\;\;\;\;x + \frac{y \cdot \left(z \cdot \left(0.0692910599291889 \cdot z + 0.4917317610505968\right) + 0.279195317918525\right)}{3.350343815022304 + z \cdot \left(z + 6.012459259764103\right)}\\

\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(0.0692910599291889, y, \mathsf{fma}\left(\frac{y}{z}, 0.07512208616047561, x\right)\right)\\

\end{array}
double f(double x, double y, double z) {
        double r16797728 = x;
        double r16797729 = y;
        double r16797730 = z;
        double r16797731 = 0.0692910599291889;
        double r16797732 = r16797730 * r16797731;
        double r16797733 = 0.4917317610505968;
        double r16797734 = r16797732 + r16797733;
        double r16797735 = r16797734 * r16797730;
        double r16797736 = 0.279195317918525;
        double r16797737 = r16797735 + r16797736;
        double r16797738 = r16797729 * r16797737;
        double r16797739 = 6.012459259764103;
        double r16797740 = r16797730 + r16797739;
        double r16797741 = r16797740 * r16797730;
        double r16797742 = 3.350343815022304;
        double r16797743 = r16797741 + r16797742;
        double r16797744 = r16797738 / r16797743;
        double r16797745 = r16797728 + r16797744;
        return r16797745;
}

double f(double x, double y, double z) {
        double r16797746 = z;
        double r16797747 = -6.09488690648802e+42;
        bool r16797748 = r16797746 <= r16797747;
        double r16797749 = 0.0692910599291889;
        double r16797750 = y;
        double r16797751 = r16797750 / r16797746;
        double r16797752 = 0.07512208616047561;
        double r16797753 = x;
        double r16797754 = fma(r16797751, r16797752, r16797753);
        double r16797755 = fma(r16797749, r16797750, r16797754);
        double r16797756 = 172322047.23901248;
        bool r16797757 = r16797746 <= r16797756;
        double r16797758 = r16797749 * r16797746;
        double r16797759 = 0.4917317610505968;
        double r16797760 = r16797758 + r16797759;
        double r16797761 = r16797746 * r16797760;
        double r16797762 = 0.279195317918525;
        double r16797763 = r16797761 + r16797762;
        double r16797764 = r16797750 * r16797763;
        double r16797765 = 3.350343815022304;
        double r16797766 = 6.012459259764103;
        double r16797767 = r16797746 + r16797766;
        double r16797768 = r16797746 * r16797767;
        double r16797769 = r16797765 + r16797768;
        double r16797770 = r16797764 / r16797769;
        double r16797771 = r16797753 + r16797770;
        double r16797772 = r16797757 ? r16797771 : r16797755;
        double r16797773 = r16797748 ? r16797755 : r16797772;
        return r16797773;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original19.8
Target0.1
Herbie0.2
\[\begin{array}{l} \mathbf{if}\;z \lt -8120153.652456675:\\ \;\;\;\;\left(\frac{0.07512208616047561}{z} + 0.0692910599291889\right) \cdot y - \left(\frac{0.40462203869992125 \cdot y}{z \cdot z} - x\right)\\ \mathbf{elif}\;z \lt 6.576118972787377 \cdot 10^{+20}:\\ \;\;\;\;x + \left(y \cdot \left(\left(z \cdot 0.0692910599291889 + 0.4917317610505968\right) \cdot z + 0.279195317918525\right)\right) \cdot \frac{1}{\left(z + 6.012459259764103\right) \cdot z + 3.350343815022304}\\ \mathbf{else}:\\ \;\;\;\;\left(\frac{0.07512208616047561}{z} + 0.0692910599291889\right) \cdot y - \left(\frac{0.40462203869992125 \cdot y}{z \cdot z} - x\right)\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if z < -6.09488690648802e+42 or 172322047.23901248 < z

    1. Initial program 42.1

      \[x + \frac{y \cdot \left(\left(z \cdot 0.0692910599291889 + 0.4917317610505968\right) \cdot z + 0.279195317918525\right)}{\left(z + 6.012459259764103\right) \cdot z + 3.350343815022304}\]
    2. Simplified35.4

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{y}{\mathsf{fma}\left(z + 6.012459259764103, z, 3.350343815022304\right)}, \mathsf{fma}\left(\mathsf{fma}\left(0.0692910599291889, z, 0.4917317610505968\right), z, 0.279195317918525\right), x\right)}\]
    3. Using strategy rm
    4. Applied clear-num35.6

      \[\leadsto \mathsf{fma}\left(\color{blue}{\frac{1}{\frac{\mathsf{fma}\left(z + 6.012459259764103, z, 3.350343815022304\right)}{y}}}, \mathsf{fma}\left(\mathsf{fma}\left(0.0692910599291889, z, 0.4917317610505968\right), z, 0.279195317918525\right), x\right)\]
    5. Taylor expanded around inf 0.0

      \[\leadsto \color{blue}{x + \left(0.07512208616047561 \cdot \frac{y}{z} + 0.0692910599291889 \cdot y\right)}\]
    6. Simplified0.0

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

    if -6.09488690648802e+42 < z < 172322047.23901248

    1. Initial program 0.5

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;z \le -6.09488690648802 \cdot 10^{+42}:\\ \;\;\;\;\mathsf{fma}\left(0.0692910599291889, y, \mathsf{fma}\left(\frac{y}{z}, 0.07512208616047561, x\right)\right)\\ \mathbf{elif}\;z \le 172322047.23901248:\\ \;\;\;\;x + \frac{y \cdot \left(z \cdot \left(0.0692910599291889 \cdot z + 0.4917317610505968\right) + 0.279195317918525\right)}{3.350343815022304 + z \cdot \left(z + 6.012459259764103\right)}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(0.0692910599291889, y, \mathsf{fma}\left(\frac{y}{z}, 0.07512208616047561, x\right)\right)\\ \end{array}\]

Reproduce

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

  :herbie-target
  (if (< z -8120153.652456675) (- (* (+ (/ 0.07512208616047561 z) 0.0692910599291889) y) (- (/ (* 0.40462203869992125 y) (* z z)) x)) (if (< z 6.576118972787377e+20) (+ x (* (* y (+ (* (+ (* z 0.0692910599291889) 0.4917317610505968) z) 0.279195317918525)) (/ 1 (+ (* (+ z 6.012459259764103) z) 3.350343815022304)))) (- (* (+ (/ 0.07512208616047561 z) 0.0692910599291889) y) (- (/ (* 0.40462203869992125 y) (* z z)) x))))

  (+ x (/ (* y (+ (* (+ (* z 0.0692910599291889) 0.4917317610505968) z) 0.279195317918525)) (+ (* (+ z 6.012459259764103) z) 3.350343815022304))))