| Alternative 1 | |
|---|---|
| Error | 1.4 |
| Cost | 21768 |
(FPCore (i n) :precision binary64 (* 100.0 (/ (- (pow (+ 1.0 (/ i n)) n) 1.0) (/ i n))))
(FPCore (i n)
:precision binary64
(let* ((t_0 (+ (pow (+ 1.0 (/ i n)) n) -1.0)) (t_1 (/ t_0 (/ i n))))
(if (<= t_1 1e-205)
(/ 100.0 (/ (/ i n) (expm1 (* n (log1p (/ i n))))))
(if (<= t_1 2000.0)
(* 100.0 (* n (/ t_0 i)))
(/ 100.0 (/ (+ 1.0 (* i -0.5)) n))))))double code(double i, double n) {
return 100.0 * ((pow((1.0 + (i / n)), n) - 1.0) / (i / n));
}
double code(double i, double n) {
double t_0 = pow((1.0 + (i / n)), n) + -1.0;
double t_1 = t_0 / (i / n);
double tmp;
if (t_1 <= 1e-205) {
tmp = 100.0 / ((i / n) / expm1((n * log1p((i / n)))));
} else if (t_1 <= 2000.0) {
tmp = 100.0 * (n * (t_0 / i));
} else {
tmp = 100.0 / ((1.0 + (i * -0.5)) / n);
}
return tmp;
}
public static double code(double i, double n) {
return 100.0 * ((Math.pow((1.0 + (i / n)), n) - 1.0) / (i / n));
}
public static double code(double i, double n) {
double t_0 = Math.pow((1.0 + (i / n)), n) + -1.0;
double t_1 = t_0 / (i / n);
double tmp;
if (t_1 <= 1e-205) {
tmp = 100.0 / ((i / n) / Math.expm1((n * Math.log1p((i / n)))));
} else if (t_1 <= 2000.0) {
tmp = 100.0 * (n * (t_0 / i));
} else {
tmp = 100.0 / ((1.0 + (i * -0.5)) / n);
}
return tmp;
}
def code(i, n): return 100.0 * ((math.pow((1.0 + (i / n)), n) - 1.0) / (i / n))
def code(i, n): t_0 = math.pow((1.0 + (i / n)), n) + -1.0 t_1 = t_0 / (i / n) tmp = 0 if t_1 <= 1e-205: tmp = 100.0 / ((i / n) / math.expm1((n * math.log1p((i / n))))) elif t_1 <= 2000.0: tmp = 100.0 * (n * (t_0 / i)) else: tmp = 100.0 / ((1.0 + (i * -0.5)) / n) return tmp
function code(i, n) return Float64(100.0 * Float64(Float64((Float64(1.0 + Float64(i / n)) ^ n) - 1.0) / Float64(i / n))) end
function code(i, n) t_0 = Float64((Float64(1.0 + Float64(i / n)) ^ n) + -1.0) t_1 = Float64(t_0 / Float64(i / n)) tmp = 0.0 if (t_1 <= 1e-205) tmp = Float64(100.0 / Float64(Float64(i / n) / expm1(Float64(n * log1p(Float64(i / n)))))); elseif (t_1 <= 2000.0) tmp = Float64(100.0 * Float64(n * Float64(t_0 / i))); else tmp = Float64(100.0 / Float64(Float64(1.0 + Float64(i * -0.5)) / n)); end return tmp end
code[i_, n_] := N[(100.0 * N[(N[(N[Power[N[(1.0 + N[(i / n), $MachinePrecision]), $MachinePrecision], n], $MachinePrecision] - 1.0), $MachinePrecision] / N[(i / n), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
code[i_, n_] := Block[{t$95$0 = N[(N[Power[N[(1.0 + N[(i / n), $MachinePrecision]), $MachinePrecision], n], $MachinePrecision] + -1.0), $MachinePrecision]}, Block[{t$95$1 = N[(t$95$0 / N[(i / n), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[t$95$1, 1e-205], N[(100.0 / N[(N[(i / n), $MachinePrecision] / N[(Exp[N[(n * N[Log[1 + N[(i / n), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]] - 1), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[t$95$1, 2000.0], N[(100.0 * N[(n * N[(t$95$0 / i), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(100.0 / N[(N[(1.0 + N[(i * -0.5), $MachinePrecision]), $MachinePrecision] / n), $MachinePrecision]), $MachinePrecision]]]]]
100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}
\begin{array}{l}
t_0 := {\left(1 + \frac{i}{n}\right)}^{n} + -1\\
t_1 := \frac{t_0}{\frac{i}{n}}\\
\mathbf{if}\;t_1 \leq 10^{-205}:\\
\;\;\;\;\frac{100}{\frac{\frac{i}{n}}{\mathsf{expm1}\left(n \cdot \mathsf{log1p}\left(\frac{i}{n}\right)\right)}}\\
\mathbf{elif}\;t_1 \leq 2000:\\
\;\;\;\;100 \cdot \left(n \cdot \frac{t_0}{i}\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{100}{\frac{1 + i \cdot -0.5}{n}}\\
\end{array}
Results
| Original | 48.0 |
|---|---|
| Target | 47.4 |
| Herbie | 1.0 |
if (/.f64 (-.f64 (pow.f64 (+.f64 1 (/.f64 i n)) n) 1) (/.f64 i n)) < 1e-205Initial program 46.5
Applied egg-rr1.0
if 1e-205 < (/.f64 (-.f64 (pow.f64 (+.f64 1 (/.f64 i n)) n) 1) (/.f64 i n)) < 2e3Initial program 1.8
Simplified1.8
[Start]1.8 | \[ 100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}
\] |
|---|---|
associate-/r/ [=>]1.8 | \[ 100 \cdot \color{blue}{\left(\frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i} \cdot n\right)}
\] |
*-commutative [=>]1.8 | \[ 100 \cdot \color{blue}{\left(n \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right)}
\] |
*-rgt-identity [<=]1.8 | \[ 100 \cdot \left(\color{blue}{\left(n \cdot 1\right)} \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right)
\] |
associate-*l* [=>]1.8 | \[ 100 \cdot \color{blue}{\left(n \cdot \left(1 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right)\right)}
\] |
*-lft-identity [=>]1.8 | \[ 100 \cdot \left(n \cdot \color{blue}{\frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}}\right)
\] |
sub-neg [=>]1.8 | \[ 100 \cdot \left(n \cdot \frac{\color{blue}{{\left(1 + \frac{i}{n}\right)}^{n} + \left(-1\right)}}{i}\right)
\] |
metadata-eval [=>]1.8 | \[ 100 \cdot \left(n \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} + \color{blue}{-1}}{i}\right)
\] |
if 2e3 < (/.f64 (-.f64 (pow.f64 (+.f64 1 (/.f64 i n)) n) 1) (/.f64 i n)) Initial program 63.0
Applied egg-rr62.9
Taylor expanded in i around 0 1.1
Simplified1.1
[Start]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \left(0.5 \cdot \frac{1}{{n}^{2}} - 0.5 \cdot \frac{1}{n}\right)}
\] |
|---|---|
associate-*r/ [=>]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \left(\color{blue}{\frac{0.5 \cdot 1}{{n}^{2}}} - 0.5 \cdot \frac{1}{n}\right)}
\] |
metadata-eval [=>]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \left(\frac{\color{blue}{0.5}}{{n}^{2}} - 0.5 \cdot \frac{1}{n}\right)}
\] |
unpow2 [=>]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \left(\frac{0.5}{\color{blue}{n \cdot n}} - 0.5 \cdot \frac{1}{n}\right)}
\] |
associate-*r/ [=>]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \left(\frac{0.5}{n \cdot n} - \color{blue}{\frac{0.5 \cdot 1}{n}}\right)}
\] |
metadata-eval [=>]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \left(\frac{0.5}{n \cdot n} - \frac{\color{blue}{0.5}}{n}\right)}
\] |
Taylor expanded in i around 0 1.1
Simplified1.1
[Start]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \left(0.5 \cdot \frac{1}{{n}^{2}} - 0.5 \cdot \frac{1}{n}\right)}
\] |
|---|---|
associate-*r/ [=>]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \left(0.5 \cdot \frac{1}{{n}^{2}} - \color{blue}{\frac{0.5 \cdot 1}{n}}\right)}
\] |
metadata-eval [=>]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \left(0.5 \cdot \frac{1}{{n}^{2}} - \frac{\color{blue}{0.5}}{n}\right)}
\] |
associate-*r/ [=>]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \left(\color{blue}{\frac{0.5 \cdot 1}{{n}^{2}}} - \frac{0.5}{n}\right)}
\] |
metadata-eval [=>]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \left(\frac{\color{blue}{0.5}}{{n}^{2}} - \frac{0.5}{n}\right)}
\] |
unpow2 [=>]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \left(\frac{0.5}{\color{blue}{n \cdot n}} - \frac{0.5}{n}\right)}
\] |
associate-/r* [=>]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \left(\color{blue}{\frac{\frac{0.5}{n}}{n}} - \frac{0.5}{n}\right)}
\] |
div-sub [<=]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \color{blue}{\frac{\frac{0.5}{n} - 0.5}{n}}}
\] |
*-lft-identity [<=]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \color{blue}{\left(1 \cdot \frac{\frac{0.5}{n} - 0.5}{n}\right)}}
\] |
*-commutative [<=]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \color{blue}{\left(\frac{\frac{0.5}{n} - 0.5}{n} \cdot 1\right)}}
\] |
associate-*l/ [=>]1.1 | \[ \frac{100}{\frac{1}{n} + i \cdot \color{blue}{\frac{\left(\frac{0.5}{n} - 0.5\right) \cdot 1}{n}}}
\] |
associate-*r/ [=>]1.1 | \[ \frac{100}{\frac{1}{n} + \color{blue}{\frac{i \cdot \left(\left(\frac{0.5}{n} - 0.5\right) \cdot 1\right)}{n}}}
\] |
*-commutative [=>]1.1 | \[ \frac{100}{\frac{1}{n} + \frac{i \cdot \color{blue}{\left(1 \cdot \left(\frac{0.5}{n} - 0.5\right)\right)}}{n}}
\] |
sub-neg [=>]1.1 | \[ \frac{100}{\frac{1}{n} + \frac{i \cdot \left(1 \cdot \color{blue}{\left(\frac{0.5}{n} + \left(-0.5\right)\right)}\right)}{n}}
\] |
metadata-eval [=>]1.1 | \[ \frac{100}{\frac{1}{n} + \frac{i \cdot \left(1 \cdot \left(\frac{0.5}{n} + \color{blue}{-0.5}\right)\right)}{n}}
\] |
distribute-lft-in [=>]1.1 | \[ \frac{100}{\frac{1}{n} + \frac{i \cdot \color{blue}{\left(1 \cdot \frac{0.5}{n} + 1 \cdot -0.5\right)}}{n}}
\] |
associate-*r/ [=>]1.1 | \[ \frac{100}{\frac{1}{n} + \frac{i \cdot \left(\color{blue}{\frac{1 \cdot 0.5}{n}} + 1 \cdot -0.5\right)}{n}}
\] |
metadata-eval [=>]1.1 | \[ \frac{100}{\frac{1}{n} + \frac{i \cdot \left(\frac{\color{blue}{0.5}}{n} + 1 \cdot -0.5\right)}{n}}
\] |
metadata-eval [=>]1.1 | \[ \frac{100}{\frac{1}{n} + \frac{i \cdot \left(\frac{0.5}{n} + \color{blue}{-0.5}\right)}{n}}
\] |
+-commutative [=>]1.1 | \[ \frac{100}{\frac{1}{n} + \frac{i \cdot \color{blue}{\left(-0.5 + \frac{0.5}{n}\right)}}{n}}
\] |
Taylor expanded in n around inf 1.2
Simplified1.2
[Start]1.2 | \[ \frac{100}{\frac{1 + -0.5 \cdot i}{n}}
\] |
|---|---|
*-commutative [=>]1.2 | \[ \frac{100}{\frac{1 + \color{blue}{i \cdot -0.5}}{n}}
\] |
Final simplification1.0
| Alternative 1 | |
|---|---|
| Error | 1.4 |
| Cost | 21768 |
| Alternative 2 | |
|---|---|
| Error | 11.8 |
| Cost | 7692 |
| Alternative 3 | |
|---|---|
| Error | 8.9 |
| Cost | 7113 |
| Alternative 4 | |
|---|---|
| Error | 8.8 |
| Cost | 7113 |
| Alternative 5 | |
|---|---|
| Error | 17.4 |
| Cost | 1229 |
| Alternative 6 | |
|---|---|
| Error | 18.7 |
| Cost | 1097 |
| Alternative 7 | |
|---|---|
| Error | 19.2 |
| Cost | 969 |
| Alternative 8 | |
|---|---|
| Error | 16.4 |
| Cost | 964 |
| Alternative 9 | |
|---|---|
| Error | 16.0 |
| Cost | 960 |
| Alternative 10 | |
|---|---|
| Error | 20.2 |
| Cost | 841 |
| Alternative 11 | |
|---|---|
| Error | 20.2 |
| Cost | 841 |
| Alternative 12 | |
|---|---|
| Error | 20.8 |
| Cost | 712 |
| Alternative 13 | |
|---|---|
| Error | 20.6 |
| Cost | 712 |
| Alternative 14 | |
|---|---|
| Error | 20.4 |
| Cost | 712 |
| Alternative 15 | |
|---|---|
| Error | 21.4 |
| Cost | 456 |
| Alternative 16 | |
|---|---|
| Error | 21.1 |
| Cost | 456 |
| Alternative 17 | |
|---|---|
| Error | 51.2 |
| Cost | 64 |
herbie shell --seed 2023060
(FPCore (i n)
:name "Compound Interest"
:precision binary64
:herbie-target
(* 100.0 (/ (- (exp (* n (if (== (+ 1.0 (/ i n)) 1.0) (/ i n) (/ (* (/ i n) (log (+ 1.0 (/ i n)))) (- (+ (/ i n) 1.0) 1.0))))) 1.0) (/ i n)))
(* 100.0 (/ (- (pow (+ 1.0 (/ i n)) n) 1.0) (/ i n))))