Average Error: 20.7 → 8.6
Time: 3.7s
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 -1.316818702600376 \cdot 10^{-118}:\\ \;\;\;\;-1\\ \mathbf{elif}\;y \le 1.5133568360584157 \cdot 10^{-199}:\\ \;\;\;\;1\\ \mathbf{elif}\;y \le 1.26512110104530408 \cdot 10^{-172}:\\ \;\;\;\;-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 -1.316818702600376 \cdot 10^{-118}:\\
\;\;\;\;-1\\

\mathbf{elif}\;y \le 1.5133568360584157 \cdot 10^{-199}:\\
\;\;\;\;1\\

\mathbf{elif}\;y \le 1.26512110104530408 \cdot 10^{-172}:\\
\;\;\;\;-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 r94329 = x;
        double r94330 = y;
        double r94331 = r94329 - r94330;
        double r94332 = r94329 + r94330;
        double r94333 = r94331 * r94332;
        double r94334 = r94329 * r94329;
        double r94335 = r94330 * r94330;
        double r94336 = r94334 + r94335;
        double r94337 = r94333 / r94336;
        return r94337;
}

double f(double x, double y) {
        double r94338 = y;
        double r94339 = -1.316818702600376e-118;
        bool r94340 = r94338 <= r94339;
        double r94341 = -1.0;
        double r94342 = 1.5133568360584157e-199;
        bool r94343 = r94338 <= r94342;
        double r94344 = 1.0;
        double r94345 = 1.2651211010453041e-172;
        bool r94346 = r94338 <= r94345;
        double r94347 = x;
        double r94348 = r94347 - r94338;
        double r94349 = r94347 + r94338;
        double r94350 = r94348 * r94349;
        double r94351 = r94347 * r94347;
        double r94352 = r94338 * r94338;
        double r94353 = r94351 + r94352;
        double r94354 = r94350 / r94353;
        double r94355 = r94346 ? r94341 : r94354;
        double r94356 = r94343 ? r94344 : r94355;
        double r94357 = r94340 ? r94341 : r94356;
        return r94357;
}

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.7
Target0.1
Herbie8.6
\[\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 < -1.316818702600376e-118 or 1.5133568360584157e-199 < y < 1.2651211010453041e-172

    1. Initial program 24.0

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

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

    if -1.316818702600376e-118 < y < 1.5133568360584157e-199

    1. Initial program 26.3

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

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

    if 1.2651211010453041e-172 < y

    1. Initial program 1.8

      \[\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\]
  3. Recombined 3 regimes into one program.
  4. Final simplification8.6

    \[\leadsto \begin{array}{l} \mathbf{if}\;y \le -1.316818702600376 \cdot 10^{-118}:\\ \;\;\;\;-1\\ \mathbf{elif}\;y \le 1.5133568360584157 \cdot 10^{-199}:\\ \;\;\;\;1\\ \mathbf{elif}\;y \le 1.26512110104530408 \cdot 10^{-172}:\\ \;\;\;\;-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 2020027 
(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))))