Average Error: 60.2 → 14.7
Time: 16.5s
Precision: binary64
\[-1 < \varepsilon \land \varepsilon < 1\]
\[ \begin{array}{c}[a, b] = \mathsf{sort}([a, b])\\ \end{array} \]
\[\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 := \frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right) \cdot \frac{\mathsf{expm1}\left(\varepsilon \cdot a\right)}{\mathsf{expm1}\left(\varepsilon \cdot \left(b + a\right)\right)}}\\ \mathbf{if}\;b \leq -1468921.9320928177:\\ \;\;\;\;t_0\\ \mathbf{elif}\;b \leq 1.3173603602197661 \cdot 10^{-169}:\\ \;\;\;\;\frac{1}{b}\\ \mathbf{elif}\;b \leq 6.12998103399392 \cdot 10^{-110}:\\ \;\;\;\;\frac{1}{a}\\ \mathbf{elif}\;b \leq 1.0047759367962661 \cdot 10^{-32}:\\ \;\;\;\;t_0\\ \mathbf{elif}\;b \leq 115459654249290030:\\ \;\;\;\;\frac{1}{a}\\ \mathbf{elif}\;b \leq 3.774224499861799 \cdot 10^{+27}:\\ \;\;\;\;\frac{1}{b}\\ \mathbf{elif}\;b \leq 4.2 \cdot 10^{+98}:\\ \;\;\;\;\frac{1}{a}\\ \mathbf{elif}\;b \leq 1.35 \cdot 10^{+130}:\\ \;\;\;\;t_0\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{a}\\ \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
         (/
          eps
          (*
           (expm1 (* b eps))
           (/ (expm1 (* eps a)) (expm1 (* eps (+ b a))))))))
   (if (<= b -1468921.9320928177)
     t_0
     (if (<= b 1.3173603602197661e-169)
       (/ 1.0 b)
       (if (<= b 6.12998103399392e-110)
         (/ 1.0 a)
         (if (<= b 1.0047759367962661e-32)
           t_0
           (if (<= b 115459654249290030.0)
             (/ 1.0 a)
             (if (<= b 3.774224499861799e+27)
               (/ 1.0 b)
               (if (<= b 4.2e+98)
                 (/ 1.0 a)
                 (if (<= b 1.35e+130) t_0 (/ 1.0 a)))))))))))
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 = eps / (expm1((b * eps)) * (expm1((eps * a)) / expm1((eps * (b + a)))));
	double tmp;
	if (b <= -1468921.9320928177) {
		tmp = t_0;
	} else if (b <= 1.3173603602197661e-169) {
		tmp = 1.0 / b;
	} else if (b <= 6.12998103399392e-110) {
		tmp = 1.0 / a;
	} else if (b <= 1.0047759367962661e-32) {
		tmp = t_0;
	} else if (b <= 115459654249290030.0) {
		tmp = 1.0 / a;
	} else if (b <= 3.774224499861799e+27) {
		tmp = 1.0 / b;
	} else if (b <= 4.2e+98) {
		tmp = 1.0 / a;
	} else if (b <= 1.35e+130) {
		tmp = t_0;
	} else {
		tmp = 1.0 / a;
	}
	return tmp;
}
public static double code(double a, double b, double eps) {
	return (eps * (Math.exp(((a + b) * eps)) - 1.0)) / ((Math.exp((a * eps)) - 1.0) * (Math.exp((b * eps)) - 1.0));
}
public static double code(double a, double b, double eps) {
	double t_0 = eps / (Math.expm1((b * eps)) * (Math.expm1((eps * a)) / Math.expm1((eps * (b + a)))));
	double tmp;
	if (b <= -1468921.9320928177) {
		tmp = t_0;
	} else if (b <= 1.3173603602197661e-169) {
		tmp = 1.0 / b;
	} else if (b <= 6.12998103399392e-110) {
		tmp = 1.0 / a;
	} else if (b <= 1.0047759367962661e-32) {
		tmp = t_0;
	} else if (b <= 115459654249290030.0) {
		tmp = 1.0 / a;
	} else if (b <= 3.774224499861799e+27) {
		tmp = 1.0 / b;
	} else if (b <= 4.2e+98) {
		tmp = 1.0 / a;
	} else if (b <= 1.35e+130) {
		tmp = t_0;
	} else {
		tmp = 1.0 / a;
	}
	return tmp;
}
def code(a, b, eps):
	return (eps * (math.exp(((a + b) * eps)) - 1.0)) / ((math.exp((a * eps)) - 1.0) * (math.exp((b * eps)) - 1.0))
def code(a, b, eps):
	t_0 = eps / (math.expm1((b * eps)) * (math.expm1((eps * a)) / math.expm1((eps * (b + a)))))
	tmp = 0
	if b <= -1468921.9320928177:
		tmp = t_0
	elif b <= 1.3173603602197661e-169:
		tmp = 1.0 / b
	elif b <= 6.12998103399392e-110:
		tmp = 1.0 / a
	elif b <= 1.0047759367962661e-32:
		tmp = t_0
	elif b <= 115459654249290030.0:
		tmp = 1.0 / a
	elif b <= 3.774224499861799e+27:
		tmp = 1.0 / b
	elif b <= 4.2e+98:
		tmp = 1.0 / a
	elif b <= 1.35e+130:
		tmp = t_0
	else:
		tmp = 1.0 / a
	return tmp
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 = Float64(eps / Float64(expm1(Float64(b * eps)) * Float64(expm1(Float64(eps * a)) / expm1(Float64(eps * Float64(b + a))))))
	tmp = 0.0
	if (b <= -1468921.9320928177)
		tmp = t_0;
	elseif (b <= 1.3173603602197661e-169)
		tmp = Float64(1.0 / b);
	elseif (b <= 6.12998103399392e-110)
		tmp = Float64(1.0 / a);
	elseif (b <= 1.0047759367962661e-32)
		tmp = t_0;
	elseif (b <= 115459654249290030.0)
		tmp = Float64(1.0 / a);
	elseif (b <= 3.774224499861799e+27)
		tmp = Float64(1.0 / b);
	elseif (b <= 4.2e+98)
		tmp = Float64(1.0 / a);
	elseif (b <= 1.35e+130)
		tmp = t_0;
	else
		tmp = Float64(1.0 / a);
	end
	return tmp
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[(eps / N[(N[(Exp[N[(b * eps), $MachinePrecision]] - 1), $MachinePrecision] * N[(N[(Exp[N[(eps * a), $MachinePrecision]] - 1), $MachinePrecision] / N[(Exp[N[(eps * N[(b + a), $MachinePrecision]), $MachinePrecision]] - 1), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[b, -1468921.9320928177], t$95$0, If[LessEqual[b, 1.3173603602197661e-169], N[(1.0 / b), $MachinePrecision], If[LessEqual[b, 6.12998103399392e-110], N[(1.0 / a), $MachinePrecision], If[LessEqual[b, 1.0047759367962661e-32], t$95$0, If[LessEqual[b, 115459654249290030.0], N[(1.0 / a), $MachinePrecision], If[LessEqual[b, 3.774224499861799e+27], N[(1.0 / b), $MachinePrecision], If[LessEqual[b, 4.2e+98], N[(1.0 / a), $MachinePrecision], If[LessEqual[b, 1.35e+130], t$95$0, N[(1.0 / a), $MachinePrecision]]]]]]]]]]
\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 := \frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right) \cdot \frac{\mathsf{expm1}\left(\varepsilon \cdot a\right)}{\mathsf{expm1}\left(\varepsilon \cdot \left(b + a\right)\right)}}\\
\mathbf{if}\;b \leq -1468921.9320928177:\\
\;\;\;\;t_0\\

\mathbf{elif}\;b \leq 1.3173603602197661 \cdot 10^{-169}:\\
\;\;\;\;\frac{1}{b}\\

\mathbf{elif}\;b \leq 6.12998103399392 \cdot 10^{-110}:\\
\;\;\;\;\frac{1}{a}\\

\mathbf{elif}\;b \leq 1.0047759367962661 \cdot 10^{-32}:\\
\;\;\;\;t_0\\

\mathbf{elif}\;b \leq 115459654249290030:\\
\;\;\;\;\frac{1}{a}\\

\mathbf{elif}\;b \leq 3.774224499861799 \cdot 10^{+27}:\\
\;\;\;\;\frac{1}{b}\\

\mathbf{elif}\;b \leq 4.2 \cdot 10^{+98}:\\
\;\;\;\;\frac{1}{a}\\

\mathbf{elif}\;b \leq 1.35 \cdot 10^{+130}:\\
\;\;\;\;t_0\\

\mathbf{else}:\\
\;\;\;\;\frac{1}{a}\\


\end{array}

Error

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original60.2
Target15.0
Herbie14.7
\[\frac{a + b}{a \cdot b} \]

Derivation

  1. Split input into 3 regimes
  2. if b < -1468921.93209281773 or 6.12998103399392025e-110 < b < 1.0047759367962661e-32 or 4.20000000000000008e98 < b < 1.3499999999999999e130

    1. Initial program 58.5

      \[\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. Simplified21.8

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

      \[\leadsto \color{blue}{\frac{\varepsilon}{\mathsf{expm1}\left(\varepsilon \cdot b\right) \cdot \frac{\mathsf{expm1}\left(\varepsilon \cdot a\right)}{\mathsf{expm1}\left(\varepsilon \cdot \left(a + b\right)\right)}}} \]

    if -1468921.93209281773 < b < 1.3173603602197661e-169 or 115459654249290032 < b < 3.7742244998617989e27

    1. Initial program 63.9

      \[\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. Simplified43.1

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

      \[\leadsto \color{blue}{\frac{\varepsilon}{\mathsf{expm1}\left(\varepsilon \cdot b\right) \cdot \frac{\mathsf{expm1}\left(\varepsilon \cdot a\right)}{\mathsf{expm1}\left(\varepsilon \cdot \left(a + b\right)\right)}}} \]
    4. Taylor expanded in b around 0 8.6

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

    if 1.3173603602197661e-169 < b < 6.12998103399392025e-110 or 1.0047759367962661e-32 < b < 115459654249290032 or 3.7742244998617989e27 < b < 4.20000000000000008e98 or 1.3499999999999999e130 < b

    1. Initial program 58.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. Simplified24.5

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

      \[\leadsto \color{blue}{\frac{\varepsilon}{\mathsf{expm1}\left(\varepsilon \cdot b\right) \cdot \frac{\mathsf{expm1}\left(\varepsilon \cdot a\right)}{\mathsf{expm1}\left(\varepsilon \cdot \left(a + b\right)\right)}}} \]
    4. Taylor expanded in a around 0 16.7

      \[\leadsto \color{blue}{\frac{1}{a}} \]
  3. Recombined 3 regimes into one program.
  4. Final simplification14.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \leq -1468921.9320928177:\\ \;\;\;\;\frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right) \cdot \frac{\mathsf{expm1}\left(\varepsilon \cdot a\right)}{\mathsf{expm1}\left(\varepsilon \cdot \left(b + a\right)\right)}}\\ \mathbf{elif}\;b \leq 1.3173603602197661 \cdot 10^{-169}:\\ \;\;\;\;\frac{1}{b}\\ \mathbf{elif}\;b \leq 6.12998103399392 \cdot 10^{-110}:\\ \;\;\;\;\frac{1}{a}\\ \mathbf{elif}\;b \leq 1.0047759367962661 \cdot 10^{-32}:\\ \;\;\;\;\frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right) \cdot \frac{\mathsf{expm1}\left(\varepsilon \cdot a\right)}{\mathsf{expm1}\left(\varepsilon \cdot \left(b + a\right)\right)}}\\ \mathbf{elif}\;b \leq 115459654249290030:\\ \;\;\;\;\frac{1}{a}\\ \mathbf{elif}\;b \leq 3.774224499861799 \cdot 10^{+27}:\\ \;\;\;\;\frac{1}{b}\\ \mathbf{elif}\;b \leq 4.2 \cdot 10^{+98}:\\ \;\;\;\;\frac{1}{a}\\ \mathbf{elif}\;b \leq 1.35 \cdot 10^{+130}:\\ \;\;\;\;\frac{\varepsilon}{\mathsf{expm1}\left(b \cdot \varepsilon\right) \cdot \frac{\mathsf{expm1}\left(\varepsilon \cdot a\right)}{\mathsf{expm1}\left(\varepsilon \cdot \left(b + a\right)\right)}}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{a}\\ \end{array} \]

Reproduce

herbie shell --seed 2022210 
(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))))