(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}
Results
| Original | 60.2 |
|---|---|
| Target | 15.0 |
| Herbie | 14.7 |
if b < -1468921.93209281773 or 6.12998103399392025e-110 < b < 1.0047759367962661e-32 or 4.20000000000000008e98 < b < 1.3499999999999999e130Initial program 58.5
Simplified21.8
Applied egg-rr20.7
if -1468921.93209281773 < b < 1.3173603602197661e-169 or 115459654249290032 < b < 3.7742244998617989e27Initial program 63.9
Simplified43.1
Applied egg-rr41.1
Taylor expanded in b around 0 8.6
if 1.3173603602197661e-169 < b < 6.12998103399392025e-110 or 1.0047759367962661e-32 < b < 115459654249290032 or 3.7742244998617989e27 < b < 4.20000000000000008e98 or 1.3499999999999999e130 < b Initial program 58.0
Simplified24.5
Applied egg-rr23.1
Taylor expanded in a around 0 16.7
Final simplification14.7
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))))