Average Error: 18.3 → 0.1
Time: 8.1s
Precision: 64
\[1 - \log \left(1 - \frac{x - y}{1 - y}\right)\]
\[\begin{array}{l} \mathbf{if}\;y \le -150668776.177258164 \lor \neg \left(y \le 15857199.25534847\right):\\ \;\;\;\;1 - \log \left(1 \cdot \left(\frac{x}{{y}^{2}} - \frac{1}{y}\right) + \frac{x}{y}\right)\\ \mathbf{else}:\\ \;\;\;\;\log \left(\frac{e^{1}}{1 - \frac{x - y}{1 - y}}\right)\\ \end{array}\]
1 - \log \left(1 - \frac{x - y}{1 - y}\right)
\begin{array}{l}
\mathbf{if}\;y \le -150668776.177258164 \lor \neg \left(y \le 15857199.25534847\right):\\
\;\;\;\;1 - \log \left(1 \cdot \left(\frac{x}{{y}^{2}} - \frac{1}{y}\right) + \frac{x}{y}\right)\\

\mathbf{else}:\\
\;\;\;\;\log \left(\frac{e^{1}}{1 - \frac{x - y}{1 - y}}\right)\\

\end{array}
double f(double x, double y) {
        double r2108 = 1.0;
        double r2109 = x;
        double r2110 = y;
        double r2111 = r2109 - r2110;
        double r2112 = r2108 - r2110;
        double r2113 = r2111 / r2112;
        double r2114 = r2108 - r2113;
        double r2115 = log(r2114);
        double r2116 = r2108 - r2115;
        return r2116;
}

double f(double x, double y) {
        double r2117 = y;
        double r2118 = -150668776.17725816;
        bool r2119 = r2117 <= r2118;
        double r2120 = 15857199.25534847;
        bool r2121 = r2117 <= r2120;
        double r2122 = !r2121;
        bool r2123 = r2119 || r2122;
        double r2124 = 1.0;
        double r2125 = x;
        double r2126 = 2.0;
        double r2127 = pow(r2117, r2126);
        double r2128 = r2125 / r2127;
        double r2129 = 1.0;
        double r2130 = r2129 / r2117;
        double r2131 = r2128 - r2130;
        double r2132 = r2124 * r2131;
        double r2133 = r2125 / r2117;
        double r2134 = r2132 + r2133;
        double r2135 = log(r2134);
        double r2136 = r2124 - r2135;
        double r2137 = exp(r2124);
        double r2138 = r2125 - r2117;
        double r2139 = r2124 - r2117;
        double r2140 = r2138 / r2139;
        double r2141 = r2124 - r2140;
        double r2142 = r2137 / r2141;
        double r2143 = log(r2142);
        double r2144 = r2123 ? r2136 : r2143;
        return r2144;
}

Error

Bits error versus x

Bits error versus y

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original18.3
Target0.1
Herbie0.1
\[\begin{array}{l} \mathbf{if}\;y \lt -81284752.619472414:\\ \;\;\;\;1 - \log \left(\frac{x}{y \cdot y} - \left(\frac{1}{y} - \frac{x}{y}\right)\right)\\ \mathbf{elif}\;y \lt 3.0094271212461764 \cdot 10^{25}:\\ \;\;\;\;\log \left(\frac{e^{1}}{1 - \frac{x - y}{1 - y}}\right)\\ \mathbf{else}:\\ \;\;\;\;1 - \log \left(\frac{x}{y \cdot y} - \left(\frac{1}{y} - \frac{x}{y}\right)\right)\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if y < -150668776.17725816 or 15857199.25534847 < y

    1. Initial program 46.5

      \[1 - \log \left(1 - \frac{x - y}{1 - y}\right)\]
    2. Taylor expanded around inf 0.1

      \[\leadsto 1 - \log \color{blue}{\left(\left(\frac{x}{y} + 1 \cdot \frac{x}{{y}^{2}}\right) - 1 \cdot \frac{1}{y}\right)}\]
    3. Simplified0.1

      \[\leadsto 1 - \log \color{blue}{\left(1 \cdot \left(\frac{x}{{y}^{2}} - \frac{1}{y}\right) + \frac{x}{y}\right)}\]

    if -150668776.17725816 < y < 15857199.25534847

    1. Initial program 0.1

      \[1 - \log \left(1 - \frac{x - y}{1 - y}\right)\]
    2. Using strategy rm
    3. Applied add-log-exp0.1

      \[\leadsto \color{blue}{\log \left(e^{1}\right)} - \log \left(1 - \frac{x - y}{1 - y}\right)\]
    4. Applied diff-log0.1

      \[\leadsto \color{blue}{\log \left(\frac{e^{1}}{1 - \frac{x - y}{1 - y}}\right)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.1

    \[\leadsto \begin{array}{l} \mathbf{if}\;y \le -150668776.177258164 \lor \neg \left(y \le 15857199.25534847\right):\\ \;\;\;\;1 - \log \left(1 \cdot \left(\frac{x}{{y}^{2}} - \frac{1}{y}\right) + \frac{x}{y}\right)\\ \mathbf{else}:\\ \;\;\;\;\log \left(\frac{e^{1}}{1 - \frac{x - y}{1 - y}}\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2020025 
(FPCore (x y)
  :name "Numeric.SpecFunctions:invIncompleteGamma from math-functions-0.1.5.2, B"
  :precision binary64

  :herbie-target
  (if (< y -81284752.61947241) (- 1 (log (- (/ x (* y y)) (- (/ 1 y) (/ x y))))) (if (< y 3.0094271212461764e+25) (log (/ (exp 1) (- 1 (/ (- x y) (- 1 y))))) (- 1 (log (- (/ x (* y y)) (- (/ 1 y) (/ x y)))))))

  (- 1 (log (- 1 (/ (- x y) (- 1 y))))))