Average Error: 60.1 → 26.4
Time: 50.7s
Precision: binary64
Cost: 27212
\[-1 < \varepsilon \land \varepsilon < 1\]
\[\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)} \]
\[\begin{array}{l} t_0 := \mathsf{expm1}\left(a \cdot \varepsilon\right)\\ t_1 := \mathsf{expm1}\left(b \cdot \varepsilon\right)\\ t_2 := \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)\\ t_3 := \varepsilon \cdot t_2\\ t_4 := \frac{t_3}{t_1 \cdot t_0}\\ \mathbf{if}\;a \leq -9.5 \cdot 10^{-162}:\\ \;\;\;\;\begin{array}{l} \mathbf{if}\;\varepsilon \ne 0:\\ \;\;\;\;\frac{\frac{t_2}{t_0}}{\frac{t_1}{\varepsilon}}\\ \mathbf{else}:\\ \;\;\;\;t_4\\ \end{array}\\ \mathbf{elif}\;a \leq 1.45 \cdot 10^{-57}:\\ \;\;\;\;\begin{array}{l} \mathbf{if}\;t_2 \ne 0:\\ \;\;\;\;\frac{\frac{\varepsilon}{t_1}}{\mathsf{fma}\left(-0.5, \left(\varepsilon \cdot \varepsilon\right) \cdot a, \frac{a}{b}\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{t_3}{t_0 \cdot t_1}\\ \end{array}\\ \mathbf{elif}\;\varepsilon \ne 0:\\ \;\;\;\;\frac{\frac{t_2}{\frac{t_0}{\varepsilon}}}{t_1}\\ \mathbf{else}:\\ \;\;\;\;t_4\\ \end{array} \]
(FPCore (a b eps)
 :precision binary64
 (/
  (* eps (- (exp (* (+ a b) eps)) 1.0))
  (* (- (exp (* a eps)) 1.0) (- (exp (* b eps)) 1.0))))
(FPCore (a b eps)
 :precision binary64
 (let* ((t_0 (expm1 (* a eps)))
        (t_1 (expm1 (* b eps)))
        (t_2 (expm1 (* (+ a b) eps)))
        (t_3 (* eps t_2))
        (t_4 (/ t_3 (* t_1 t_0))))
   (if (<= a -9.5e-162)
     (if (!= eps 0.0) (/ (/ t_2 t_0) (/ t_1 eps)) t_4)
     (if (<= a 1.45e-57)
       (if (!= t_2 0.0)
         (/ (/ eps t_1) (fma -0.5 (* (* eps eps) a) (/ a b)))
         (/ t_3 (* t_0 t_1)))
       (if (!= eps 0.0) (/ (/ t_2 (/ t_0 eps)) t_1) t_4)))))
double code(double a, double b, double eps) {
	return (eps * (exp(((a + b) * eps)) - 1.0)) / ((exp((a * eps)) - 1.0) * (exp((b * eps)) - 1.0));
}
double code(double a, double b, double eps) {
	double t_0 = expm1((a * eps));
	double t_1 = expm1((b * eps));
	double t_2 = expm1(((a + b) * eps));
	double t_3 = eps * t_2;
	double t_4 = t_3 / (t_1 * t_0);
	double tmp_1;
	if (a <= -9.5e-162) {
		double tmp_2;
		if (eps != 0.0) {
			tmp_2 = (t_2 / t_0) / (t_1 / eps);
		} else {
			tmp_2 = t_4;
		}
		tmp_1 = tmp_2;
	} else if (a <= 1.45e-57) {
		double tmp_3;
		if (t_2 != 0.0) {
			tmp_3 = (eps / t_1) / fma(-0.5, ((eps * eps) * a), (a / b));
		} else {
			tmp_3 = t_3 / (t_0 * t_1);
		}
		tmp_1 = tmp_3;
	} else if (eps != 0.0) {
		tmp_1 = (t_2 / (t_0 / eps)) / t_1;
	} else {
		tmp_1 = t_4;
	}
	return tmp_1;
}
function code(a, b, eps)
	return Float64(Float64(eps * Float64(exp(Float64(Float64(a + b) * eps)) - 1.0)) / Float64(Float64(exp(Float64(a * eps)) - 1.0) * Float64(exp(Float64(b * eps)) - 1.0)))
end
function code(a, b, eps)
	t_0 = expm1(Float64(a * eps))
	t_1 = expm1(Float64(b * eps))
	t_2 = expm1(Float64(Float64(a + b) * eps))
	t_3 = Float64(eps * t_2)
	t_4 = Float64(t_3 / Float64(t_1 * t_0))
	tmp_1 = 0.0
	if (a <= -9.5e-162)
		tmp_2 = 0.0
		if (eps != 0.0)
			tmp_2 = Float64(Float64(t_2 / t_0) / Float64(t_1 / eps));
		else
			tmp_2 = t_4;
		end
		tmp_1 = tmp_2;
	elseif (a <= 1.45e-57)
		tmp_3 = 0.0
		if (t_2 != 0.0)
			tmp_3 = Float64(Float64(eps / t_1) / fma(-0.5, Float64(Float64(eps * eps) * a), Float64(a / b)));
		else
			tmp_3 = Float64(t_3 / Float64(t_0 * t_1));
		end
		tmp_1 = tmp_3;
	elseif (eps != 0.0)
		tmp_1 = Float64(Float64(t_2 / Float64(t_0 / eps)) / t_1);
	else
		tmp_1 = t_4;
	end
	return tmp_1
end
code[a_, b_, eps_] := N[(N[(eps * N[(N[Exp[N[(N[(a + b), $MachinePrecision] * eps), $MachinePrecision]], $MachinePrecision] - 1.0), $MachinePrecision]), $MachinePrecision] / N[(N[(N[Exp[N[(a * eps), $MachinePrecision]], $MachinePrecision] - 1.0), $MachinePrecision] * N[(N[Exp[N[(b * eps), $MachinePrecision]], $MachinePrecision] - 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
code[a_, b_, eps_] := Block[{t$95$0 = N[(Exp[N[(a * eps), $MachinePrecision]] - 1), $MachinePrecision]}, Block[{t$95$1 = N[(Exp[N[(b * eps), $MachinePrecision]] - 1), $MachinePrecision]}, Block[{t$95$2 = N[(Exp[N[(N[(a + b), $MachinePrecision] * eps), $MachinePrecision]] - 1), $MachinePrecision]}, Block[{t$95$3 = N[(eps * t$95$2), $MachinePrecision]}, Block[{t$95$4 = N[(t$95$3 / N[(t$95$1 * t$95$0), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[a, -9.5e-162], If[Unequal[eps, 0.0], N[(N[(t$95$2 / t$95$0), $MachinePrecision] / N[(t$95$1 / eps), $MachinePrecision]), $MachinePrecision], t$95$4], If[LessEqual[a, 1.45e-57], If[Unequal[t$95$2, 0.0], N[(N[(eps / t$95$1), $MachinePrecision] / N[(-0.5 * N[(N[(eps * eps), $MachinePrecision] * a), $MachinePrecision] + N[(a / b), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(t$95$3 / N[(t$95$0 * t$95$1), $MachinePrecision]), $MachinePrecision]], If[Unequal[eps, 0.0], N[(N[(t$95$2 / N[(t$95$0 / eps), $MachinePrecision]), $MachinePrecision] / t$95$1), $MachinePrecision], t$95$4]]]]]]]]
\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)}
\begin{array}{l}
t_0 := \mathsf{expm1}\left(a \cdot \varepsilon\right)\\
t_1 := \mathsf{expm1}\left(b \cdot \varepsilon\right)\\
t_2 := \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)\\
t_3 := \varepsilon \cdot t_2\\
t_4 := \frac{t_3}{t_1 \cdot t_0}\\
\mathbf{if}\;a \leq -9.5 \cdot 10^{-162}:\\
\;\;\;\;\begin{array}{l}
\mathbf{if}\;\varepsilon \ne 0:\\
\;\;\;\;\frac{\frac{t_2}{t_0}}{\frac{t_1}{\varepsilon}}\\

\mathbf{else}:\\
\;\;\;\;t_4\\


\end{array}\\

\mathbf{elif}\;a \leq 1.45 \cdot 10^{-57}:\\
\;\;\;\;\begin{array}{l}
\mathbf{if}\;t_2 \ne 0:\\
\;\;\;\;\frac{\frac{\varepsilon}{t_1}}{\mathsf{fma}\left(-0.5, \left(\varepsilon \cdot \varepsilon\right) \cdot a, \frac{a}{b}\right)}\\

\mathbf{else}:\\
\;\;\;\;\frac{t_3}{t_0 \cdot t_1}\\


\end{array}\\

\mathbf{elif}\;\varepsilon \ne 0:\\
\;\;\;\;\frac{\frac{t_2}{\frac{t_0}{\varepsilon}}}{t_1}\\

\mathbf{else}:\\
\;\;\;\;t_4\\


\end{array}

Error

Target

Original60.1
Target15.1
Herbie26.4
\[\frac{a + b}{a \cdot b} \]

Derivation

  1. Split input into 3 regimes
  2. if a < -9.5000000000000004e-162

    1. Initial program 59.0

      \[\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)} \]
    2. Simplified35.1

      \[\leadsto \color{blue}{\frac{\varepsilon \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right) \cdot \mathsf{expm1}\left(b \cdot \varepsilon\right)}} \]
      Proof
    3. Applied egg-rr38.2

      \[\leadsto \color{blue}{\frac{\varepsilon}{\sqrt[3]{\mathsf{expm1}\left(b \cdot \varepsilon\right)}} \cdot \frac{\frac{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right)}}{\sqrt[3]{{\left(\mathsf{expm1}\left(b \cdot \varepsilon\right)\right)}^{2}}}} \]
    4. Applied egg-rr21.0

      \[\leadsto \color{blue}{\begin{array}{l} \color{blue}{\mathbf{if}\;\varepsilon \ne 0:\\ \;\;\;\;\frac{\frac{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right)}}{\frac{\mathsf{expm1}\left(b \cdot \varepsilon\right)}{\varepsilon}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(b \cdot \varepsilon\right) \cdot \mathsf{expm1}\left(a \cdot \varepsilon\right)}\\ } \end{array}} \]

    if -9.5000000000000004e-162 < a < 1.45000000000000013e-57

    1. Initial program 64.0

      \[\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)} \]
    2. Simplified56.2

      \[\leadsto \color{blue}{\frac{\varepsilon \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right) \cdot \mathsf{expm1}\left(b \cdot \varepsilon\right)}} \]
      Proof
    3. Applied egg-rr46.9

      \[\leadsto \color{blue}{\left(\frac{1}{\mathsf{expm1}\left(b \cdot \varepsilon\right)} \cdot \varepsilon\right) \cdot \frac{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right)}} \]
    4. Applied egg-rr46.2

      \[\leadsto \color{blue}{\begin{array}{l} \color{blue}{\mathbf{if}\;\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right) \ne 0:\\ \;\;\;\;\frac{\frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right)}}{\frac{\mathsf{expm1}\left(a \cdot \varepsilon\right)}{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right) \cdot \mathsf{expm1}\left(b \cdot \varepsilon\right)}\\ } \end{array}} \]
    5. Taylor expanded in a around 0 62.9

      \[\leadsto \begin{array}{l} \mathbf{if}\;\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right) \ne 0:\\ \;\;\;\;\frac{\frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right)}}{\color{blue}{\frac{a}{e^{\varepsilon \cdot b} - 1}}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right) \cdot \mathsf{expm1}\left(b \cdot \varepsilon\right)}\\ \end{array} \]
    6. Simplified62.5

      \[\leadsto \begin{array}{l} \mathbf{if}\;\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right) \ne 0:\\ \;\;\;\;\frac{\frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right)}}{\color{blue}{\frac{a}{\mathsf{expm1}\left(\varepsilon \cdot b\right)}}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right) \cdot \mathsf{expm1}\left(b \cdot \varepsilon\right)}\\ \end{array} \]
      Proof
    7. Taylor expanded in b around 0 38.2

      \[\leadsto \begin{array}{l} \mathbf{if}\;\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right) \ne 0:\\ \;\;\;\;\frac{\frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right)}}{\color{blue}{-0.5 \cdot \left({\varepsilon}^{2} \cdot a\right) + \frac{a}{b}}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right) \cdot \mathsf{expm1}\left(b \cdot \varepsilon\right)}\\ \end{array} \]
    8. Simplified38.2

      \[\leadsto \begin{array}{l} \mathbf{if}\;\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right) \ne 0:\\ \;\;\;\;\frac{\frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right)}}{\color{blue}{\mathsf{fma}\left(-0.5, \left(\varepsilon \cdot \varepsilon\right) \cdot a, \frac{a}{b}\right)}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right) \cdot \mathsf{expm1}\left(b \cdot \varepsilon\right)}\\ \end{array} \]
      Proof

    if 1.45000000000000013e-57 < a

    1. Initial program 56.6

      \[\frac{\varepsilon \cdot \left(e^{\left(a + b\right) \cdot \varepsilon} - 1\right)}{\left(e^{a \cdot \varepsilon} - 1\right) \cdot \left(e^{b \cdot \varepsilon} - 1\right)} \]
    2. Simplified29.9

      \[\leadsto \color{blue}{\frac{\varepsilon \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right) \cdot \mathsf{expm1}\left(b \cdot \varepsilon\right)}} \]
      Proof
    3. Applied egg-rr36.4

      \[\leadsto \color{blue}{\frac{\varepsilon}{\sqrt[3]{\mathsf{expm1}\left(b \cdot \varepsilon\right)}} \cdot \frac{\frac{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right)}}{\sqrt[3]{{\left(\mathsf{expm1}\left(b \cdot \varepsilon\right)\right)}^{2}}}} \]
    4. Applied egg-rr18.7

      \[\leadsto \color{blue}{\begin{array}{l} \color{blue}{\mathbf{if}\;\varepsilon \ne 0:\\ \;\;\;\;\frac{\frac{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right)}}{\frac{\mathsf{expm1}\left(b \cdot \varepsilon\right)}{\varepsilon}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(b \cdot \varepsilon\right) \cdot \mathsf{expm1}\left(a \cdot \varepsilon\right)}\\ } \end{array}} \]
    5. Applied egg-rr18.8

      \[\leadsto \begin{array}{l} \mathbf{if}\;\varepsilon \ne 0:\\ \;\;\;\;\color{blue}{\frac{\frac{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\frac{\mathsf{expm1}\left(a \cdot \varepsilon\right)}{\varepsilon}}}{\mathsf{expm1}\left(b \cdot \varepsilon\right)}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(b \cdot \varepsilon\right) \cdot \mathsf{expm1}\left(a \cdot \varepsilon\right)}\\ \end{array} \]
  3. Recombined 3 regimes into one program.

Alternatives

Alternative 1
Error38.9
Cost20560
\[\begin{array}{l} t_0 := \mathsf{expm1}\left(\varepsilon \cdot b\right)\\ t_1 := \mathsf{expm1}\left(a \cdot \varepsilon\right)\\ t_2 := \frac{\varepsilon}{t_1}\\ t_3 := \frac{\varepsilon}{t_0}\\ \mathbf{if}\;b \leq -3.7 \cdot 10^{+87}:\\ \;\;\;\;t_2\\ \mathbf{elif}\;b \leq -8 \cdot 10^{+49}:\\ \;\;\;\;t_3\\ \mathbf{elif}\;b \leq -2.7 \cdot 10^{-43}:\\ \;\;\;\;t_2\\ \mathbf{elif}\;b \leq 4.2 \cdot 10^{+72}:\\ \;\;\;\;t_3\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right)}}{t_1} \cdot t_0\\ \end{array} \]
Alternative 2
Error29.3
Cost20292
\[\begin{array}{l} t_0 := \mathsf{expm1}\left(b \cdot \varepsilon\right)\\ t_1 := \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)\\ t_2 := \mathsf{expm1}\left(a \cdot \varepsilon\right)\\ \mathbf{if}\;\varepsilon \ne 0:\\ \;\;\;\;\frac{\frac{t_1}{t_2}}{\frac{t_0}{\varepsilon}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\varepsilon \cdot t_1}{t_0 \cdot t_2}\\ \end{array} \]
Alternative 3
Error30.6
Cost20160
\[\varepsilon \cdot \frac{\frac{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(b \cdot \varepsilon\right)}}{\mathsf{expm1}\left(a \cdot \varepsilon\right)} \]
Alternative 4
Error29.3
Cost20160
\[\frac{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right)} \cdot \frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right)} \]
Alternative 5
Error29.4
Cost20160
\[\frac{\mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(b \cdot \varepsilon\right)} \cdot \frac{\varepsilon}{\mathsf{expm1}\left(a \cdot \varepsilon\right)} \]
Alternative 6
Error29.2
Cost20160
\[\frac{\frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right)} \cdot \mathsf{expm1}\left(\left(a + b\right) \cdot \varepsilon\right)}{\mathsf{expm1}\left(a \cdot \varepsilon\right)} \]
Alternative 7
Error38.8
Cost7248
\[\begin{array}{l} t_0 := \frac{\varepsilon}{\mathsf{expm1}\left(a \cdot \varepsilon\right)}\\ t_1 := \frac{\varepsilon}{\mathsf{expm1}\left(\varepsilon \cdot b\right)}\\ \mathbf{if}\;b \leq -1.45 \cdot 10^{+87}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;b \leq -3.6 \cdot 10^{+49}:\\ \;\;\;\;t_1\\ \mathbf{elif}\;b \leq -2.7 \cdot 10^{-43}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;b \leq 1.2 \cdot 10^{+71}:\\ \;\;\;\;t_1\\ \mathbf{else}:\\ \;\;\;\;t_0\\ \end{array} \]
Alternative 8
Error45.5
Cost6720
\[\frac{\varepsilon}{\mathsf{expm1}\left(a \cdot \varepsilon\right)} \]
Alternative 9
Error61.5
Cost192
\[\frac{\varepsilon}{a} \]
Alternative 10
Error61.9
Cost64
\[1 \]

Error

Reproduce

herbie shell --seed 2023010 
(FPCore (a b eps)
  :name "expq3 (problem 3.4.2)"
  :precision binary64
  :pre (and (< -1.0 eps) (< eps 1.0))

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

  (/ (* eps (- (exp (* (+ a b) eps)) 1.0)) (* (- (exp (* a eps)) 1.0) (- (exp (* b eps)) 1.0))))