Average Error: 23.9 → 0.8
Time: 4.3s
Precision: binary64
\[\left(0 \leq x \land x \leq 1000000000\right) \land \left(-1 \leq \varepsilon \land \varepsilon \leq 1\right)\]
\[x - \sqrt{x \cdot x - \varepsilon} \]
\[\begin{array}{l} \mathbf{if}\;x - \sqrt{x \cdot x - \varepsilon} \leq -1.1367628655699785 \cdot 10^{-152}:\\ \;\;\;\;\frac{1}{\frac{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}{\varepsilon}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon}{\mathsf{fma}\left(x, 2, \frac{\varepsilon}{x} \cdot -0.5\right)}\\ \end{array} \]
x - \sqrt{x \cdot x - \varepsilon}
\begin{array}{l}
\mathbf{if}\;x - \sqrt{x \cdot x - \varepsilon} \leq -1.1367628655699785 \cdot 10^{-152}:\\
\;\;\;\;\frac{1}{\frac{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}{\varepsilon}}\\

\mathbf{else}:\\
\;\;\;\;\frac{\varepsilon}{\mathsf{fma}\left(x, 2, \frac{\varepsilon}{x} \cdot -0.5\right)}\\


\end{array}
(FPCore (x eps) :precision binary64 (- x (sqrt (- (* x x) eps))))
(FPCore (x eps)
 :precision binary64
 (if (<= (- x (sqrt (- (* x x) eps))) -1.1367628655699785e-152)
   (/ 1.0 (/ (+ x (hypot (sqrt (- eps)) x)) eps))
   (/ eps (fma x 2.0 (* (/ eps x) -0.5)))))
double code(double x, double eps) {
	return x - sqrt(((x * x) - eps));
}
double code(double x, double eps) {
	double tmp;
	if ((x - sqrt(((x * x) - eps))) <= -1.1367628655699785e-152) {
		tmp = 1.0 / ((x + hypot(sqrt(-eps), x)) / eps);
	} else {
		tmp = eps / fma(x, 2.0, ((eps / x) * -0.5));
	}
	return tmp;
}

Error

Bits error versus x

Bits error versus eps

Target

Original23.9
Target0.3
Herbie0.8
\[\frac{\varepsilon}{x + \sqrt{x \cdot x - \varepsilon}} \]

Derivation

  1. Split input into 2 regimes
  2. if (-.f64 x (sqrt.f64 (-.f64 (*.f64 x x) eps))) < -1.1367628655699785e-152

    1. Initial program 0.7

      \[x - \sqrt{x \cdot x - \varepsilon} \]
    2. Applied flip--_binary640.8

      \[\leadsto \color{blue}{\frac{x \cdot x - \sqrt{x \cdot x - \varepsilon} \cdot \sqrt{x \cdot x - \varepsilon}}{x + \sqrt{x \cdot x - \varepsilon}}} \]
    3. Simplified0.5

      \[\leadsto \frac{\color{blue}{\varepsilon}}{x + \sqrt{x \cdot x - \varepsilon}} \]
    4. Simplified0.5

      \[\leadsto \frac{\varepsilon}{\color{blue}{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}} \]
    5. Applied add-sqr-sqrt_binary640.7

      \[\leadsto \frac{\varepsilon}{\color{blue}{\sqrt{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)} \cdot \sqrt{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}}} \]
    6. Applied associate-/r*_binary640.6

      \[\leadsto \color{blue}{\frac{\frac{\varepsilon}{\sqrt{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}}}{\sqrt{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}}} \]
    7. Applied *-un-lft-identity_binary640.6

      \[\leadsto \frac{\frac{\varepsilon}{\color{blue}{1 \cdot \sqrt{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}}}}{\sqrt{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}} \]
    8. Applied *-un-lft-identity_binary640.6

      \[\leadsto \frac{\frac{\color{blue}{1 \cdot \varepsilon}}{1 \cdot \sqrt{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}}}{\sqrt{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}} \]
    9. Applied times-frac_binary640.6

      \[\leadsto \frac{\color{blue}{\frac{1}{1} \cdot \frac{\varepsilon}{\sqrt{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}}}}{\sqrt{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}} \]
    10. Applied associate-/l*_binary640.7

      \[\leadsto \color{blue}{\frac{\frac{1}{1}}{\frac{\sqrt{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}}{\frac{\varepsilon}{\sqrt{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}}}}} \]
    11. Simplified0.5

      \[\leadsto \frac{\frac{1}{1}}{\color{blue}{\frac{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}{\varepsilon}}} \]

    if -1.1367628655699785e-152 < (-.f64 x (sqrt.f64 (-.f64 (*.f64 x x) eps)))

    1. Initial program 58.2

      \[x - \sqrt{x \cdot x - \varepsilon} \]
    2. Applied flip--_binary6458.2

      \[\leadsto \color{blue}{\frac{x \cdot x - \sqrt{x \cdot x - \varepsilon} \cdot \sqrt{x \cdot x - \varepsilon}}{x + \sqrt{x \cdot x - \varepsilon}}} \]
    3. Simplified0.0

      \[\leadsto \frac{\color{blue}{\varepsilon}}{x + \sqrt{x \cdot x - \varepsilon}} \]
    4. Simplified34.3

      \[\leadsto \frac{\varepsilon}{\color{blue}{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}} \]
    5. Taylor expanded in x around inf 35.1

      \[\leadsto \frac{\varepsilon}{\color{blue}{0.5 \cdot \frac{{\left(\sqrt{-\varepsilon}\right)}^{2}}{x} + 2 \cdot x}} \]
    6. Simplified1.3

      \[\leadsto \frac{\varepsilon}{\color{blue}{\mathsf{fma}\left(x, 2, \frac{\varepsilon}{x} \cdot -0.5\right)}} \]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.8

    \[\leadsto \begin{array}{l} \mathbf{if}\;x - \sqrt{x \cdot x - \varepsilon} \leq -1.1367628655699785 \cdot 10^{-152}:\\ \;\;\;\;\frac{1}{\frac{x + \mathsf{hypot}\left(\sqrt{-\varepsilon}, x\right)}{\varepsilon}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon}{\mathsf{fma}\left(x, 2, \frac{\varepsilon}{x} \cdot -0.5\right)}\\ \end{array} \]

Reproduce

herbie shell --seed 2022125 
(FPCore (x eps)
  :name "ENA, Section 1.4, Exercise 4d"
  :precision binary64
  :pre (and (and (<= 0.0 x) (<= x 1000000000.0)) (and (<= -1.0 eps) (<= eps 1.0)))

  :herbie-target
  (/ eps (+ x (sqrt (- (* x x) eps))))

  (- x (sqrt (- (* x x) eps))))