Average Error: 21.7 → 0.3
Time: 24.4s
Precision: 64
\[1.0 - \frac{\left(1.0 - x\right) \cdot y}{y + 1.0}\]
\[\begin{array}{l} \mathbf{if}\;y \le -6.66464768403957 \cdot 10^{+16}:\\ \;\;\;\;\left(x + \frac{1.0}{y}\right) - \frac{x \cdot 1.0}{y}\\ \mathbf{elif}\;y \le 157501004.5008886:\\ \;\;\;\;1.0 - y \cdot \frac{1.0 - x}{y + 1.0}\\ \mathbf{else}:\\ \;\;\;\;\left(x + \frac{1.0}{y}\right) - \frac{x \cdot 1.0}{y}\\ \end{array}\]
1.0 - \frac{\left(1.0 - x\right) \cdot y}{y + 1.0}
\begin{array}{l}
\mathbf{if}\;y \le -6.66464768403957 \cdot 10^{+16}:\\
\;\;\;\;\left(x + \frac{1.0}{y}\right) - \frac{x \cdot 1.0}{y}\\

\mathbf{elif}\;y \le 157501004.5008886:\\
\;\;\;\;1.0 - y \cdot \frac{1.0 - x}{y + 1.0}\\

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

\end{array}
double f(double x, double y) {
        double r29522909 = 1.0;
        double r29522910 = x;
        double r29522911 = r29522909 - r29522910;
        double r29522912 = y;
        double r29522913 = r29522911 * r29522912;
        double r29522914 = r29522912 + r29522909;
        double r29522915 = r29522913 / r29522914;
        double r29522916 = r29522909 - r29522915;
        return r29522916;
}

double f(double x, double y) {
        double r29522917 = y;
        double r29522918 = -6.66464768403957e+16;
        bool r29522919 = r29522917 <= r29522918;
        double r29522920 = x;
        double r29522921 = 1.0;
        double r29522922 = r29522921 / r29522917;
        double r29522923 = r29522920 + r29522922;
        double r29522924 = r29522920 * r29522921;
        double r29522925 = r29522924 / r29522917;
        double r29522926 = r29522923 - r29522925;
        double r29522927 = 157501004.5008886;
        bool r29522928 = r29522917 <= r29522927;
        double r29522929 = r29522921 - r29522920;
        double r29522930 = r29522917 + r29522921;
        double r29522931 = r29522929 / r29522930;
        double r29522932 = r29522917 * r29522931;
        double r29522933 = r29522921 - r29522932;
        double r29522934 = r29522928 ? r29522933 : r29522926;
        double r29522935 = r29522919 ? r29522926 : r29522934;
        return r29522935;
}

Error

Bits error versus x

Bits error versus y

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original21.7
Target0.2
Herbie0.3
\[\begin{array}{l} \mathbf{if}\;y \lt -3693.8482788297247:\\ \;\;\;\;\frac{1.0}{y} - \left(\frac{x}{y} - x\right)\\ \mathbf{elif}\;y \lt 6799310503.41891:\\ \;\;\;\;1.0 - \frac{\left(1.0 - x\right) \cdot y}{y + 1.0}\\ \mathbf{else}:\\ \;\;\;\;\frac{1.0}{y} - \left(\frac{x}{y} - x\right)\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if y < -6.66464768403957e+16 or 157501004.5008886 < y

    1. Initial program 45.7

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

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

      \[\leadsto \color{blue}{\left(x + \frac{1.0}{y}\right) - \frac{1.0 \cdot x}{y}}\]

    if -6.66464768403957e+16 < y < 157501004.5008886

    1. Initial program 0.5

      \[1.0 - \frac{\left(1.0 - x\right) \cdot y}{y + 1.0}\]
    2. Using strategy rm
    3. Applied *-un-lft-identity0.5

      \[\leadsto 1.0 - \frac{\left(1.0 - x\right) \cdot y}{\color{blue}{1 \cdot \left(y + 1.0\right)}}\]
    4. Applied *-commutative0.5

      \[\leadsto 1.0 - \frac{\color{blue}{y \cdot \left(1.0 - x\right)}}{1 \cdot \left(y + 1.0\right)}\]
    5. Applied times-frac0.4

      \[\leadsto 1.0 - \color{blue}{\frac{y}{1} \cdot \frac{1.0 - x}{y + 1.0}}\]
    6. Simplified0.4

      \[\leadsto 1.0 - \color{blue}{y} \cdot \frac{1.0 - x}{y + 1.0}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.3

    \[\leadsto \begin{array}{l} \mathbf{if}\;y \le -6.66464768403957 \cdot 10^{+16}:\\ \;\;\;\;\left(x + \frac{1.0}{y}\right) - \frac{x \cdot 1.0}{y}\\ \mathbf{elif}\;y \le 157501004.5008886:\\ \;\;\;\;1.0 - y \cdot \frac{1.0 - x}{y + 1.0}\\ \mathbf{else}:\\ \;\;\;\;\left(x + \frac{1.0}{y}\right) - \frac{x \cdot 1.0}{y}\\ \end{array}\]

Reproduce

herbie shell --seed 2019158 
(FPCore (x y)
  :name "Diagrams.Trail:splitAtParam  from diagrams-lib-1.3.0.3, D"

  :herbie-target
  (if (< y -3693.8482788297247) (- (/ 1.0 y) (- (/ x y) x)) (if (< y 6799310503.41891) (- 1.0 (/ (* (- 1.0 x) y) (+ y 1.0))) (- (/ 1.0 y) (- (/ x y) x))))

  (- 1.0 (/ (* (- 1.0 x) y) (+ y 1.0))))