Average Error: 3.9 → 2.1
Time: 1.9s
Precision: binary64
\[a \cdot a - b \cdot b \]
\[\begin{array}{l} \mathbf{if}\;a \cdot a \leq 3.6361091965505894 \cdot 10^{+301}:\\ \;\;\;\;a \cdot a - b \cdot b\\ \mathbf{else}:\\ \;\;\;\;{a}^{2}\\ \end{array} \]
a \cdot a - b \cdot b
\begin{array}{l}
\mathbf{if}\;a \cdot a \leq 3.6361091965505894 \cdot 10^{+301}:\\
\;\;\;\;a \cdot a - b \cdot b\\

\mathbf{else}:\\
\;\;\;\;{a}^{2}\\


\end{array}
(FPCore (a b) :precision binary64 (- (* a a) (* b b)))
(FPCore (a b)
 :precision binary64
 (if (<= (* a a) 3.6361091965505894e+301) (- (* a a) (* b b)) (pow a 2.0)))
double code(double a, double b) {
	return (a * a) - (b * b);
}
double code(double a, double b) {
	double tmp;
	if ((a * a) <= 3.6361091965505894e+301) {
		tmp = (a * a) - (b * b);
	} else {
		tmp = pow(a, 2.0);
	}
	return tmp;
}

Error

Bits error versus a

Bits error versus b

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original3.9
Target0.0
Herbie2.1
\[\left(a + b\right) \cdot \left(a - b\right) \]

Derivation

  1. Split input into 2 regimes
  2. if (*.f64 a a) < 3.63610919655058944e301

    1. Initial program 0.0

      \[a \cdot a - b \cdot b \]

    if 3.63610919655058944e301 < (*.f64 a a)

    1. Initial program 15.4

      \[a \cdot a - b \cdot b \]
    2. Taylor expanded in a around inf 8.3

      \[\leadsto \color{blue}{{a}^{2}} \]
  3. Recombined 2 regimes into one program.
  4. Final simplification2.1

    \[\leadsto \begin{array}{l} \mathbf{if}\;a \cdot a \leq 3.6361091965505894 \cdot 10^{+301}:\\ \;\;\;\;a \cdot a - b \cdot b\\ \mathbf{else}:\\ \;\;\;\;{a}^{2}\\ \end{array} \]

Reproduce

herbie shell --seed 2022068 
(FPCore (a b)
  :name "Difference of squares"
  :precision binary64

  :herbie-target
  (* (+ a b) (- a b))

  (- (* a a) (* b b)))