Average Error: 29.5 → 1.5
Time: 28.1s
Precision: 64
\[x + \frac{y \cdot \left(\left(\left(\left(z \cdot 3.13060547622999996 + 11.166754126200001\right) \cdot z + t\right) \cdot z + a\right) \cdot z + b\right)}{\left(\left(\left(z + 15.234687406999999\right) \cdot z + 31.469011574900001\right) \cdot z + 11.940090572100001\right) \cdot z + 0.60777138777100004}\]
\[\begin{array}{l} \mathbf{if}\;z \le -7.33305524808745187 \cdot 10^{34} \lor \neg \left(z \le 50333907682696732700\right):\\ \;\;\;\;\mathsf{fma}\left(y, 3.13060547622999996 + \frac{\sqrt[3]{t}}{\frac{\left|z\right|}{\sqrt[3]{t}}} \cdot \frac{\sqrt[3]{t}}{\left|z\right|}, x\right)\\ \mathbf{else}:\\ \;\;\;\;x + \frac{y \cdot \left(\left(\left(\left(z \cdot 3.13060547622999996 + 11.166754126200001\right) \cdot z + t\right) \cdot z + a\right) \cdot z + b\right)}{\left(\left(\left(z + 15.234687406999999\right) \cdot z + 31.469011574900001\right) \cdot z + 11.940090572100001\right) \cdot z + 0.60777138777100004}\\ \end{array}\]
x + \frac{y \cdot \left(\left(\left(\left(z \cdot 3.13060547622999996 + 11.166754126200001\right) \cdot z + t\right) \cdot z + a\right) \cdot z + b\right)}{\left(\left(\left(z + 15.234687406999999\right) \cdot z + 31.469011574900001\right) \cdot z + 11.940090572100001\right) \cdot z + 0.60777138777100004}
\begin{array}{l}
\mathbf{if}\;z \le -7.33305524808745187 \cdot 10^{34} \lor \neg \left(z \le 50333907682696732700\right):\\
\;\;\;\;\mathsf{fma}\left(y, 3.13060547622999996 + \frac{\sqrt[3]{t}}{\frac{\left|z\right|}{\sqrt[3]{t}}} \cdot \frac{\sqrt[3]{t}}{\left|z\right|}, x\right)\\

\mathbf{else}:\\
\;\;\;\;x + \frac{y \cdot \left(\left(\left(\left(z \cdot 3.13060547622999996 + 11.166754126200001\right) \cdot z + t\right) \cdot z + a\right) \cdot z + b\right)}{\left(\left(\left(z + 15.234687406999999\right) \cdot z + 31.469011574900001\right) \cdot z + 11.940090572100001\right) \cdot z + 0.60777138777100004}\\

\end{array}
double f(double x, double y, double z, double t, double a, double b) {
        double r243255 = x;
        double r243256 = y;
        double r243257 = z;
        double r243258 = 3.13060547623;
        double r243259 = r243257 * r243258;
        double r243260 = 11.1667541262;
        double r243261 = r243259 + r243260;
        double r243262 = r243261 * r243257;
        double r243263 = t;
        double r243264 = r243262 + r243263;
        double r243265 = r243264 * r243257;
        double r243266 = a;
        double r243267 = r243265 + r243266;
        double r243268 = r243267 * r243257;
        double r243269 = b;
        double r243270 = r243268 + r243269;
        double r243271 = r243256 * r243270;
        double r243272 = 15.234687407;
        double r243273 = r243257 + r243272;
        double r243274 = r243273 * r243257;
        double r243275 = 31.4690115749;
        double r243276 = r243274 + r243275;
        double r243277 = r243276 * r243257;
        double r243278 = 11.9400905721;
        double r243279 = r243277 + r243278;
        double r243280 = r243279 * r243257;
        double r243281 = 0.607771387771;
        double r243282 = r243280 + r243281;
        double r243283 = r243271 / r243282;
        double r243284 = r243255 + r243283;
        return r243284;
}

double f(double x, double y, double z, double t, double a, double b) {
        double r243285 = z;
        double r243286 = -7.333055248087452e+34;
        bool r243287 = r243285 <= r243286;
        double r243288 = 5.033390768269673e+19;
        bool r243289 = r243285 <= r243288;
        double r243290 = !r243289;
        bool r243291 = r243287 || r243290;
        double r243292 = y;
        double r243293 = 3.13060547623;
        double r243294 = t;
        double r243295 = cbrt(r243294);
        double r243296 = fabs(r243285);
        double r243297 = r243296 / r243295;
        double r243298 = r243295 / r243297;
        double r243299 = r243295 / r243296;
        double r243300 = r243298 * r243299;
        double r243301 = r243293 + r243300;
        double r243302 = x;
        double r243303 = fma(r243292, r243301, r243302);
        double r243304 = r243285 * r243293;
        double r243305 = 11.1667541262;
        double r243306 = r243304 + r243305;
        double r243307 = r243306 * r243285;
        double r243308 = r243307 + r243294;
        double r243309 = r243308 * r243285;
        double r243310 = a;
        double r243311 = r243309 + r243310;
        double r243312 = r243311 * r243285;
        double r243313 = b;
        double r243314 = r243312 + r243313;
        double r243315 = r243292 * r243314;
        double r243316 = 15.234687407;
        double r243317 = r243285 + r243316;
        double r243318 = r243317 * r243285;
        double r243319 = 31.4690115749;
        double r243320 = r243318 + r243319;
        double r243321 = r243320 * r243285;
        double r243322 = 11.9400905721;
        double r243323 = r243321 + r243322;
        double r243324 = r243323 * r243285;
        double r243325 = 0.607771387771;
        double r243326 = r243324 + r243325;
        double r243327 = r243315 / r243326;
        double r243328 = r243302 + r243327;
        double r243329 = r243291 ? r243303 : r243328;
        return r243329;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Bits error versus a

Bits error versus b

Target

Original29.5
Target1.1
Herbie1.5
\[\begin{array}{l} \mathbf{if}\;z \lt -6.4993449962526318 \cdot 10^{53}:\\ \;\;\;\;x + \left(\left(3.13060547622999996 - \frac{36.527041698806414}{z}\right) + \frac{t}{z \cdot z}\right) \cdot \frac{y}{1}\\ \mathbf{elif}\;z \lt 7.0669654369142868 \cdot 10^{59}:\\ \;\;\;\;x + \frac{y}{\frac{\left(\left(\left(z + 15.234687406999999\right) \cdot z + 31.469011574900001\right) \cdot z + 11.940090572100001\right) \cdot z + 0.60777138777100004}{\left(\left(\left(z \cdot 3.13060547622999996 + 11.166754126200001\right) \cdot z + t\right) \cdot z + a\right) \cdot z + b}}\\ \mathbf{else}:\\ \;\;\;\;x + \left(\left(3.13060547622999996 - \frac{36.527041698806414}{z}\right) + \frac{t}{z \cdot z}\right) \cdot \frac{y}{1}\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if z < -7.333055248087452e+34 or 5.033390768269673e+19 < z

    1. Initial program 58.2

      \[x + \frac{y \cdot \left(\left(\left(\left(z \cdot 3.13060547622999996 + 11.166754126200001\right) \cdot z + t\right) \cdot z + a\right) \cdot z + b\right)}{\left(\left(\left(z + 15.234687406999999\right) \cdot z + 31.469011574900001\right) \cdot z + 11.940090572100001\right) \cdot z + 0.60777138777100004}\]
    2. Simplified56.0

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{y}{\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(z + 15.234687406999999, z, 31.469011574900001\right), z, 11.940090572100001\right), z, 0.60777138777100004\right)}, \mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(z, 3.13060547622999996, 11.166754126200001\right), z, t\right), z, a\right), z, b\right), x\right)}\]
    3. Taylor expanded around inf 8.7

      \[\leadsto \color{blue}{x + \left(\frac{t \cdot y}{{z}^{2}} + 3.13060547622999996 \cdot y\right)}\]
    4. Simplified1.9

      \[\leadsto \color{blue}{\mathsf{fma}\left(y, 3.13060547622999996 + \frac{t}{{z}^{2}}, x\right)}\]
    5. Using strategy rm
    6. Applied add-sqr-sqrt1.9

      \[\leadsto \mathsf{fma}\left(y, 3.13060547622999996 + \frac{t}{\color{blue}{\sqrt{{z}^{2}} \cdot \sqrt{{z}^{2}}}}, x\right)\]
    7. Applied add-cube-cbrt1.9

      \[\leadsto \mathsf{fma}\left(y, 3.13060547622999996 + \frac{\color{blue}{\left(\sqrt[3]{t} \cdot \sqrt[3]{t}\right) \cdot \sqrt[3]{t}}}{\sqrt{{z}^{2}} \cdot \sqrt{{z}^{2}}}, x\right)\]
    8. Applied times-frac1.9

      \[\leadsto \mathsf{fma}\left(y, 3.13060547622999996 + \color{blue}{\frac{\sqrt[3]{t} \cdot \sqrt[3]{t}}{\sqrt{{z}^{2}}} \cdot \frac{\sqrt[3]{t}}{\sqrt{{z}^{2}}}}, x\right)\]
    9. Simplified1.9

      \[\leadsto \mathsf{fma}\left(y, 3.13060547622999996 + \color{blue}{\frac{\sqrt[3]{t}}{\frac{\left|z\right|}{\sqrt[3]{t}}}} \cdot \frac{\sqrt[3]{t}}{\sqrt{{z}^{2}}}, x\right)\]
    10. Simplified1.9

      \[\leadsto \mathsf{fma}\left(y, 3.13060547622999996 + \frac{\sqrt[3]{t}}{\frac{\left|z\right|}{\sqrt[3]{t}}} \cdot \color{blue}{\frac{\sqrt[3]{t}}{\left|z\right|}}, x\right)\]

    if -7.333055248087452e+34 < z < 5.033390768269673e+19

    1. Initial program 1.2

      \[x + \frac{y \cdot \left(\left(\left(\left(z \cdot 3.13060547622999996 + 11.166754126200001\right) \cdot z + t\right) \cdot z + a\right) \cdot z + b\right)}{\left(\left(\left(z + 15.234687406999999\right) \cdot z + 31.469011574900001\right) \cdot z + 11.940090572100001\right) \cdot z + 0.60777138777100004}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification1.5

    \[\leadsto \begin{array}{l} \mathbf{if}\;z \le -7.33305524808745187 \cdot 10^{34} \lor \neg \left(z \le 50333907682696732700\right):\\ \;\;\;\;\mathsf{fma}\left(y, 3.13060547622999996 + \frac{\sqrt[3]{t}}{\frac{\left|z\right|}{\sqrt[3]{t}}} \cdot \frac{\sqrt[3]{t}}{\left|z\right|}, x\right)\\ \mathbf{else}:\\ \;\;\;\;x + \frac{y \cdot \left(\left(\left(\left(z \cdot 3.13060547622999996 + 11.166754126200001\right) \cdot z + t\right) \cdot z + a\right) \cdot z + b\right)}{\left(\left(\left(z + 15.234687406999999\right) \cdot z + 31.469011574900001\right) \cdot z + 11.940090572100001\right) \cdot z + 0.60777138777100004}\\ \end{array}\]

Reproduce

herbie shell --seed 2019199 +o rules:numerics
(FPCore (x y z t a b)
  :name "Numeric.SpecFunctions:logGamma from math-functions-0.1.5.2, D"

  :herbie-target
  (if (< z -6.499344996252632e+53) (+ x (* (+ (- 3.13060547623 (/ 36.527041698806414 z)) (/ t (* z z))) (/ y 1.0))) (if (< z 7.066965436914287e+59) (+ x (/ y (/ (+ (* (+ (* (+ (* (+ z 15.234687407) z) 31.4690115749) z) 11.9400905721) z) 0.607771387771) (+ (* (+ (* (+ (* (+ (* z 3.13060547623) 11.1667541262) z) t) z) a) z) b)))) (+ x (* (+ (- 3.13060547623 (/ 36.527041698806414 z)) (/ t (* z z))) (/ y 1.0)))))

  (+ x (/ (* y (+ (* (+ (* (+ (* (+ (* z 3.13060547623) 11.1667541262) z) t) z) a) z) b)) (+ (* (+ (* (+ (* (+ z 15.234687407) z) 31.4690115749) z) 11.9400905721) z) 0.607771387771))))