Average Error: 5.9 → 2.5
Time: 26.6s
Precision: 64
\[\left(\left(\left(x - 0.5\right) \cdot \log x - x\right) + 0.91893853320467\right) + \frac{\left(\left(y + 0.0007936500793651\right) \cdot z - 0.0027777777777778\right) \cdot z + 0.083333333333333}{x}\]
\[\begin{array}{l} \mathbf{if}\;x \le 2.010811705498022 \cdot 10^{+137}:\\ \;\;\;\;\frac{\mathsf{fma}\left(z, z \cdot \left(0.0007936500793651 + y\right) - 0.0027777777777778, 0.083333333333333\right)}{x} - \frac{x \cdot x - \mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right) \cdot \mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right)}{\mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right) + x}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\frac{z}{\frac{x}{z}}, 0.0007936500793651, \frac{0.083333333333333}{x} - 0.0027777777777778 \cdot \frac{z}{x}\right) - \left(\mathsf{fma}\left(-\log x, x - 0.5, x\right) - 0.91893853320467\right)\\ \end{array}\]
\left(\left(\left(x - 0.5\right) \cdot \log x - x\right) + 0.91893853320467\right) + \frac{\left(\left(y + 0.0007936500793651\right) \cdot z - 0.0027777777777778\right) \cdot z + 0.083333333333333}{x}
\begin{array}{l}
\mathbf{if}\;x \le 2.010811705498022 \cdot 10^{+137}:\\
\;\;\;\;\frac{\mathsf{fma}\left(z, z \cdot \left(0.0007936500793651 + y\right) - 0.0027777777777778, 0.083333333333333\right)}{x} - \frac{x \cdot x - \mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right) \cdot \mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right)}{\mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right) + x}\\

\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{z}{\frac{x}{z}}, 0.0007936500793651, \frac{0.083333333333333}{x} - 0.0027777777777778 \cdot \frac{z}{x}\right) - \left(\mathsf{fma}\left(-\log x, x - 0.5, x\right) - 0.91893853320467\right)\\

\end{array}
double f(double x, double y, double z) {
        double r20477317 = x;
        double r20477318 = 0.5;
        double r20477319 = r20477317 - r20477318;
        double r20477320 = log(r20477317);
        double r20477321 = r20477319 * r20477320;
        double r20477322 = r20477321 - r20477317;
        double r20477323 = 0.91893853320467;
        double r20477324 = r20477322 + r20477323;
        double r20477325 = y;
        double r20477326 = 0.0007936500793651;
        double r20477327 = r20477325 + r20477326;
        double r20477328 = z;
        double r20477329 = r20477327 * r20477328;
        double r20477330 = 0.0027777777777778;
        double r20477331 = r20477329 - r20477330;
        double r20477332 = r20477331 * r20477328;
        double r20477333 = 0.083333333333333;
        double r20477334 = r20477332 + r20477333;
        double r20477335 = r20477334 / r20477317;
        double r20477336 = r20477324 + r20477335;
        return r20477336;
}

double f(double x, double y, double z) {
        double r20477337 = x;
        double r20477338 = 2.010811705498022e+137;
        bool r20477339 = r20477337 <= r20477338;
        double r20477340 = z;
        double r20477341 = 0.0007936500793651;
        double r20477342 = y;
        double r20477343 = r20477341 + r20477342;
        double r20477344 = r20477340 * r20477343;
        double r20477345 = 0.0027777777777778;
        double r20477346 = r20477344 - r20477345;
        double r20477347 = 0.083333333333333;
        double r20477348 = fma(r20477340, r20477346, r20477347);
        double r20477349 = r20477348 / r20477337;
        double r20477350 = r20477337 * r20477337;
        double r20477351 = log(r20477337);
        double r20477352 = 0.5;
        double r20477353 = r20477337 - r20477352;
        double r20477354 = 0.91893853320467;
        double r20477355 = fma(r20477351, r20477353, r20477354);
        double r20477356 = r20477355 * r20477355;
        double r20477357 = r20477350 - r20477356;
        double r20477358 = r20477355 + r20477337;
        double r20477359 = r20477357 / r20477358;
        double r20477360 = r20477349 - r20477359;
        double r20477361 = r20477337 / r20477340;
        double r20477362 = r20477340 / r20477361;
        double r20477363 = r20477347 / r20477337;
        double r20477364 = r20477340 / r20477337;
        double r20477365 = r20477345 * r20477364;
        double r20477366 = r20477363 - r20477365;
        double r20477367 = fma(r20477362, r20477341, r20477366);
        double r20477368 = -r20477351;
        double r20477369 = fma(r20477368, r20477353, r20477337);
        double r20477370 = r20477369 - r20477354;
        double r20477371 = r20477367 - r20477370;
        double r20477372 = r20477339 ? r20477360 : r20477371;
        return r20477372;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original5.9
Target1.1
Herbie2.5
\[\left(\left(\left(x - 0.5\right) \cdot \log x + \left(0.91893853320467 - x\right)\right) + \frac{0.083333333333333}{x}\right) + \frac{z}{x} \cdot \left(z \cdot \left(y + 0.0007936500793651\right) - 0.0027777777777778\right)\]

Derivation

  1. Split input into 2 regimes
  2. if x < 2.010811705498022e+137

    1. Initial program 2.1

      \[\left(\left(\left(x - 0.5\right) \cdot \log x - x\right) + 0.91893853320467\right) + \frac{\left(\left(y + 0.0007936500793651\right) \cdot z - 0.0027777777777778\right) \cdot z + 0.083333333333333}{x}\]
    2. Simplified2.1

      \[\leadsto \color{blue}{\frac{\mathsf{fma}\left(z, \left(y + 0.0007936500793651\right) \cdot z - 0.0027777777777778, 0.083333333333333\right)}{x} - \left(x - \mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right)\right)}\]
    3. Using strategy rm
    4. Applied flip--2.2

      \[\leadsto \frac{\mathsf{fma}\left(z, \left(y + 0.0007936500793651\right) \cdot z - 0.0027777777777778, 0.083333333333333\right)}{x} - \color{blue}{\frac{x \cdot x - \mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right) \cdot \mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right)}{x + \mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right)}}\]

    if 2.010811705498022e+137 < x

    1. Initial program 13.0

      \[\left(\left(\left(x - 0.5\right) \cdot \log x - x\right) + 0.91893853320467\right) + \frac{\left(\left(y + 0.0007936500793651\right) \cdot z - 0.0027777777777778\right) \cdot z + 0.083333333333333}{x}\]
    2. Simplified13.0

      \[\leadsto \color{blue}{\frac{\mathsf{fma}\left(z, \left(y + 0.0007936500793651\right) \cdot z - 0.0027777777777778, 0.083333333333333\right)}{x} - \left(x - \mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right)\right)}\]
    3. Taylor expanded around inf 13.0

      \[\leadsto \frac{\mathsf{fma}\left(z, \left(y + 0.0007936500793651\right) \cdot z - 0.0027777777777778, 0.083333333333333\right)}{x} - \color{blue}{\left(\left(x + x \cdot \log \left(\frac{1}{x}\right)\right) - \left(0.5 \cdot \log \left(\frac{1}{x}\right) + 0.91893853320467\right)\right)}\]
    4. Simplified12.9

      \[\leadsto \frac{\mathsf{fma}\left(z, \left(y + 0.0007936500793651\right) \cdot z - 0.0027777777777778, 0.083333333333333\right)}{x} - \color{blue}{\left(\mathsf{fma}\left(-\log x, x - 0.5, x\right) - 0.91893853320467\right)}\]
    5. Using strategy rm
    6. Applied add-sqr-sqrt12.9

      \[\leadsto \frac{\mathsf{fma}\left(z, \left(y + 0.0007936500793651\right) \cdot z - 0.0027777777777778, 0.083333333333333\right)}{\color{blue}{\sqrt{x} \cdot \sqrt{x}}} - \left(\mathsf{fma}\left(-\log x, x - 0.5, x\right) - 0.91893853320467\right)\]
    7. Applied associate-/r*12.9

      \[\leadsto \color{blue}{\frac{\frac{\mathsf{fma}\left(z, \left(y + 0.0007936500793651\right) \cdot z - 0.0027777777777778, 0.083333333333333\right)}{\sqrt{x}}}{\sqrt{x}}} - \left(\mathsf{fma}\left(-\log x, x - 0.5, x\right) - 0.91893853320467\right)\]
    8. Taylor expanded around 0 10.7

      \[\leadsto \color{blue}{\left(\left(0.0007936500793651 \cdot \frac{{z}^{2}}{x} + 0.083333333333333 \cdot \frac{1}{x}\right) - 0.0027777777777778 \cdot \frac{z}{x}\right)} - \left(\mathsf{fma}\left(-\log x, x - 0.5, x\right) - 0.91893853320467\right)\]
    9. Simplified3.1

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{z}{\frac{x}{z}}, 0.0007936500793651, \frac{0.083333333333333}{x} - 0.0027777777777778 \cdot \frac{z}{x}\right)} - \left(\mathsf{fma}\left(-\log x, x - 0.5, x\right) - 0.91893853320467\right)\]
  3. Recombined 2 regimes into one program.
  4. Final simplification2.5

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le 2.010811705498022 \cdot 10^{+137}:\\ \;\;\;\;\frac{\mathsf{fma}\left(z, z \cdot \left(0.0007936500793651 + y\right) - 0.0027777777777778, 0.083333333333333\right)}{x} - \frac{x \cdot x - \mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right) \cdot \mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right)}{\mathsf{fma}\left(\log x, x - 0.5, 0.91893853320467\right) + x}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\frac{z}{\frac{x}{z}}, 0.0007936500793651, \frac{0.083333333333333}{x} - 0.0027777777777778 \cdot \frac{z}{x}\right) - \left(\mathsf{fma}\left(-\log x, x - 0.5, x\right) - 0.91893853320467\right)\\ \end{array}\]

Reproduce

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

  :herbie-target
  (+ (+ (+ (* (- x 0.5) (log x)) (- 0.91893853320467 x)) (/ 0.083333333333333 x)) (* (/ z x) (- (* z (+ y 0.0007936500793651)) 0.0027777777777778)))

  (+ (+ (- (* (- x 0.5) (log x)) x) 0.91893853320467) (/ (+ (* (- (* (+ y 0.0007936500793651) z) 0.0027777777777778) z) 0.083333333333333) x)))