Average Error: 20.1 → 5.0
Time: 3.2s
Precision: 64
\[0.0 \lt x \lt 1 \land y \lt 1\]
\[\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\]
\[\begin{array}{l} \mathbf{if}\;y \le -7.87575602010166952 \cdot 10^{153}:\\ \;\;\;\;-1\\ \mathbf{elif}\;y \le -7.5972168943171327 \cdot 10^{-156}:\\ \;\;\;\;\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\\ \mathbf{elif}\;y \le 6.20747399639024289 \cdot 10^{-162}:\\ \;\;\;\;1\\ \mathbf{else}:\\ \;\;\;\;\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\\ \end{array}\]
\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}
\begin{array}{l}
\mathbf{if}\;y \le -7.87575602010166952 \cdot 10^{153}:\\
\;\;\;\;-1\\

\mathbf{elif}\;y \le -7.5972168943171327 \cdot 10^{-156}:\\
\;\;\;\;\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\\

\mathbf{elif}\;y \le 6.20747399639024289 \cdot 10^{-162}:\\
\;\;\;\;1\\

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

\end{array}
double f(double x, double y) {
        double r79733 = x;
        double r79734 = y;
        double r79735 = r79733 - r79734;
        double r79736 = r79733 + r79734;
        double r79737 = r79735 * r79736;
        double r79738 = r79733 * r79733;
        double r79739 = r79734 * r79734;
        double r79740 = r79738 + r79739;
        double r79741 = r79737 / r79740;
        return r79741;
}

double f(double x, double y) {
        double r79742 = y;
        double r79743 = -7.87575602010167e+153;
        bool r79744 = r79742 <= r79743;
        double r79745 = -1.0;
        double r79746 = -7.597216894317133e-156;
        bool r79747 = r79742 <= r79746;
        double r79748 = x;
        double r79749 = r79748 - r79742;
        double r79750 = r79748 + r79742;
        double r79751 = r79749 * r79750;
        double r79752 = r79748 * r79748;
        double r79753 = r79742 * r79742;
        double r79754 = r79752 + r79753;
        double r79755 = r79751 / r79754;
        double r79756 = 6.207473996390243e-162;
        bool r79757 = r79742 <= r79756;
        double r79758 = 1.0;
        double r79759 = r79757 ? r79758 : r79755;
        double r79760 = r79747 ? r79755 : r79759;
        double r79761 = r79744 ? r79745 : r79760;
        return r79761;
}

Error

Bits error versus x

Bits error versus y

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original20.1
Target0.0
Herbie5.0
\[\begin{array}{l} \mathbf{if}\;0.5 \lt \left|\frac{x}{y}\right| \lt 2:\\ \;\;\;\;\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\\ \mathbf{else}:\\ \;\;\;\;1 - \frac{2}{1 + \frac{x}{y} \cdot \frac{x}{y}}\\ \end{array}\]

Derivation

  1. Split input into 3 regimes
  2. if y < -7.87575602010167e+153

    1. Initial program 64.0

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

      \[\leadsto \color{blue}{-1}\]

    if -7.87575602010167e+153 < y < -7.597216894317133e-156 or 6.207473996390243e-162 < y

    1. Initial program 0.0

      \[\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\]

    if -7.597216894317133e-156 < y < 6.207473996390243e-162

    1. Initial program 29.4

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

      \[\leadsto \color{blue}{1}\]
  3. Recombined 3 regimes into one program.
  4. Final simplification5.0

    \[\leadsto \begin{array}{l} \mathbf{if}\;y \le -7.87575602010166952 \cdot 10^{153}:\\ \;\;\;\;-1\\ \mathbf{elif}\;y \le -7.5972168943171327 \cdot 10^{-156}:\\ \;\;\;\;\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\\ \mathbf{elif}\;y \le 6.20747399639024289 \cdot 10^{-162}:\\ \;\;\;\;1\\ \mathbf{else}:\\ \;\;\;\;\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\\ \end{array}\]

Reproduce

herbie shell --seed 2020100 
(FPCore (x y)
  :name "Kahan p9 Example"
  :precision binary64
  :pre (and (< 0.0 x 1) (< y 1))

  :herbie-target
  (if (< 0.5 (fabs (/ x y)) 2) (/ (* (- x y) (+ x y)) (+ (* x x) (* y y))) (- 1 (/ 2 (+ 1 (* (/ x y) (/ x y))))))

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