| Alternative 1 | |
|---|---|
| Error | 10.8 |
| Cost | 13900 |
(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 (* n (expm1 i))))
(if (<= i -5.1e-225)
(/ 100.0 (/ i t_0))
(if (<= i 8.5e-141)
(* 100.0 (+ n (* i (* n (+ 0.5 (/ -0.5 n))))))
(if (<= i 500.0)
(* t_0 (/ 100.0 i))
(/ (* n (* 100.0 (- (log i) (log n)))) (/ i 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 = n * expm1(i);
double tmp;
if (i <= -5.1e-225) {
tmp = 100.0 / (i / t_0);
} else if (i <= 8.5e-141) {
tmp = 100.0 * (n + (i * (n * (0.5 + (-0.5 / n)))));
} else if (i <= 500.0) {
tmp = t_0 * (100.0 / i);
} else {
tmp = (n * (100.0 * (log(i) - log(n)))) / (i / 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 = n * Math.expm1(i);
double tmp;
if (i <= -5.1e-225) {
tmp = 100.0 / (i / t_0);
} else if (i <= 8.5e-141) {
tmp = 100.0 * (n + (i * (n * (0.5 + (-0.5 / n)))));
} else if (i <= 500.0) {
tmp = t_0 * (100.0 / i);
} else {
tmp = (n * (100.0 * (Math.log(i) - Math.log(n)))) / (i / 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 = n * math.expm1(i) tmp = 0 if i <= -5.1e-225: tmp = 100.0 / (i / t_0) elif i <= 8.5e-141: tmp = 100.0 * (n + (i * (n * (0.5 + (-0.5 / n))))) elif i <= 500.0: tmp = t_0 * (100.0 / i) else: tmp = (n * (100.0 * (math.log(i) - math.log(n)))) / (i / 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(n * expm1(i)) tmp = 0.0 if (i <= -5.1e-225) tmp = Float64(100.0 / Float64(i / t_0)); elseif (i <= 8.5e-141) tmp = Float64(100.0 * Float64(n + Float64(i * Float64(n * Float64(0.5 + Float64(-0.5 / n)))))); elseif (i <= 500.0) tmp = Float64(t_0 * Float64(100.0 / i)); else tmp = Float64(Float64(n * Float64(100.0 * Float64(log(i) - log(n)))) / Float64(i / 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 * N[(Exp[i] - 1), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[i, -5.1e-225], N[(100.0 / N[(i / t$95$0), $MachinePrecision]), $MachinePrecision], If[LessEqual[i, 8.5e-141], N[(100.0 * N[(n + N[(i * N[(n * N[(0.5 + N[(-0.5 / n), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[i, 500.0], N[(t$95$0 * N[(100.0 / i), $MachinePrecision]), $MachinePrecision], N[(N[(n * N[(100.0 * N[(N[Log[i], $MachinePrecision] - N[Log[n], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(i / n), $MachinePrecision]), $MachinePrecision]]]]]
100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}
\begin{array}{l}
t_0 := n \cdot \mathsf{expm1}\left(i\right)\\
\mathbf{if}\;i \leq -5.1 \cdot 10^{-225}:\\
\;\;\;\;\frac{100}{\frac{i}{t_0}}\\
\mathbf{elif}\;i \leq 8.5 \cdot 10^{-141}:\\
\;\;\;\;100 \cdot \left(n + i \cdot \left(n \cdot \left(0.5 + \frac{-0.5}{n}\right)\right)\right)\\
\mathbf{elif}\;i \leq 500:\\
\;\;\;\;t_0 \cdot \frac{100}{i}\\
\mathbf{else}:\\
\;\;\;\;\frac{n \cdot \left(100 \cdot \left(\log i - \log n\right)\right)}{\frac{i}{n}}\\
\end{array}
Results
| Original | 47.8 |
|---|---|
| Target | 47.5 |
| Herbie | 10.8 |
if i < -5.0999999999999999e-225Initial program 42.0
Simplified42.2
[Start]42.0 | \[ 100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}
\] |
|---|---|
associate-/r/ [=>]42.2 | \[ 100 \cdot \color{blue}{\left(\frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i} \cdot n\right)}
\] |
*-commutative [=>]42.2 | \[ 100 \cdot \color{blue}{\left(n \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right)}
\] |
*-rgt-identity [<=]42.2 | \[ 100 \cdot \left(\color{blue}{\left(n \cdot 1\right)} \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right)
\] |
associate-*l* [=>]42.2 | \[ 100 \cdot \color{blue}{\left(n \cdot \left(1 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right)\right)}
\] |
*-lft-identity [=>]42.2 | \[ 100 \cdot \left(n \cdot \color{blue}{\frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}}\right)
\] |
sub-neg [=>]42.2 | \[ 100 \cdot \left(n \cdot \frac{\color{blue}{{\left(1 + \frac{i}{n}\right)}^{n} + \left(-1\right)}}{i}\right)
\] |
metadata-eval [=>]42.2 | \[ 100 \cdot \left(n \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} + \color{blue}{-1}}{i}\right)
\] |
Taylor expanded in n around inf 33.9
Simplified11.7
[Start]33.9 | \[ 100 \cdot \frac{n \cdot \left(e^{i} - 1\right)}{i}
\] |
|---|---|
associate-*r/ [=>]34.0 | \[ \color{blue}{\frac{100 \cdot \left(n \cdot \left(e^{i} - 1\right)\right)}{i}}
\] |
associate-/l* [=>]33.5 | \[ \color{blue}{\frac{100}{\frac{i}{n \cdot \left(e^{i} - 1\right)}}}
\] |
expm1-def [=>]11.7 | \[ \frac{100}{\frac{i}{n \cdot \color{blue}{\mathsf{expm1}\left(i\right)}}}
\] |
if -5.0999999999999999e-225 < i < 8.50000000000000021e-141Initial program 60.8
Simplified60.3
[Start]60.8 | \[ 100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}
\] |
|---|---|
associate-/r/ [=>]60.3 | \[ 100 \cdot \color{blue}{\left(\frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i} \cdot n\right)}
\] |
*-commutative [=>]60.3 | \[ 100 \cdot \color{blue}{\left(n \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right)}
\] |
*-rgt-identity [<=]60.3 | \[ 100 \cdot \left(\color{blue}{\left(n \cdot 1\right)} \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right)
\] |
associate-*l* [=>]60.3 | \[ 100 \cdot \color{blue}{\left(n \cdot \left(1 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right)\right)}
\] |
*-lft-identity [=>]60.3 | \[ 100 \cdot \left(n \cdot \color{blue}{\frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}}\right)
\] |
sub-neg [=>]60.3 | \[ 100 \cdot \left(n \cdot \frac{\color{blue}{{\left(1 + \frac{i}{n}\right)}^{n} + \left(-1\right)}}{i}\right)
\] |
metadata-eval [=>]60.3 | \[ 100 \cdot \left(n \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} + \color{blue}{-1}}{i}\right)
\] |
Taylor expanded in i around 0 4.2
Simplified4.2
[Start]4.2 | \[ 100 \cdot \left(n \cdot \left(i \cdot \left(0.5 - 0.5 \cdot \frac{1}{n}\right)\right)\right) + 100 \cdot n
\] |
|---|---|
distribute-lft-out [=>]4.2 | \[ \color{blue}{100 \cdot \left(n \cdot \left(i \cdot \left(0.5 - 0.5 \cdot \frac{1}{n}\right)\right) + n\right)}
\] |
+-commutative [<=]4.2 | \[ 100 \cdot \color{blue}{\left(n + n \cdot \left(i \cdot \left(0.5 - 0.5 \cdot \frac{1}{n}\right)\right)\right)}
\] |
*-commutative [=>]4.2 | \[ \color{blue}{\left(n + n \cdot \left(i \cdot \left(0.5 - 0.5 \cdot \frac{1}{n}\right)\right)\right) \cdot 100}
\] |
associate-*r* [=>]4.3 | \[ \left(n + \color{blue}{\left(n \cdot i\right) \cdot \left(0.5 - 0.5 \cdot \frac{1}{n}\right)}\right) \cdot 100
\] |
*-commutative [=>]4.3 | \[ \left(n + \color{blue}{\left(i \cdot n\right)} \cdot \left(0.5 - 0.5 \cdot \frac{1}{n}\right)\right) \cdot 100
\] |
associate-*l* [=>]4.2 | \[ \left(n + \color{blue}{i \cdot \left(n \cdot \left(0.5 - 0.5 \cdot \frac{1}{n}\right)\right)}\right) \cdot 100
\] |
cancel-sign-sub-inv [=>]4.2 | \[ \left(n + i \cdot \left(n \cdot \color{blue}{\left(0.5 + \left(-0.5\right) \cdot \frac{1}{n}\right)}\right)\right) \cdot 100
\] |
metadata-eval [=>]4.2 | \[ \left(n + i \cdot \left(n \cdot \left(0.5 + \color{blue}{-0.5} \cdot \frac{1}{n}\right)\right)\right) \cdot 100
\] |
associate-*r/ [=>]4.2 | \[ \left(n + i \cdot \left(n \cdot \left(0.5 + \color{blue}{\frac{-0.5 \cdot 1}{n}}\right)\right)\right) \cdot 100
\] |
metadata-eval [=>]4.2 | \[ \left(n + i \cdot \left(n \cdot \left(0.5 + \frac{\color{blue}{-0.5}}{n}\right)\right)\right) \cdot 100
\] |
if 8.50000000000000021e-141 < i < 500Initial program 54.3
Simplified54.2
[Start]54.3 | \[ 100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}
\] |
|---|---|
associate-/r/ [=>]54.2 | \[ 100 \cdot \color{blue}{\left(\frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i} \cdot n\right)}
\] |
*-commutative [=>]54.2 | \[ 100 \cdot \color{blue}{\left(n \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right)}
\] |
*-rgt-identity [<=]54.2 | \[ 100 \cdot \left(\color{blue}{\left(n \cdot 1\right)} \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right)
\] |
associate-*l* [=>]54.2 | \[ 100 \cdot \color{blue}{\left(n \cdot \left(1 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right)\right)}
\] |
*-lft-identity [=>]54.2 | \[ 100 \cdot \left(n \cdot \color{blue}{\frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}}\right)
\] |
sub-neg [=>]54.2 | \[ 100 \cdot \left(n \cdot \frac{\color{blue}{{\left(1 + \frac{i}{n}\right)}^{n} + \left(-1\right)}}{i}\right)
\] |
metadata-eval [=>]54.2 | \[ 100 \cdot \left(n \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} + \color{blue}{-1}}{i}\right)
\] |
Taylor expanded in n around inf 52.8
Simplified13.0
[Start]52.8 | \[ 100 \cdot \frac{n \cdot \left(e^{i} - 1\right)}{i}
\] |
|---|---|
associate-*r/ [=>]52.8 | \[ \color{blue}{\frac{100 \cdot \left(n \cdot \left(e^{i} - 1\right)\right)}{i}}
\] |
associate-/l* [=>]52.8 | \[ \color{blue}{\frac{100}{\frac{i}{n \cdot \left(e^{i} - 1\right)}}}
\] |
expm1-def [=>]13.0 | \[ \frac{100}{\frac{i}{n \cdot \color{blue}{\mathsf{expm1}\left(i\right)}}}
\] |
Applied egg-rr13.0
if 500 < i Initial program 33.3
Simplified33.3
[Start]33.3 | \[ 100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}
\] |
|---|---|
associate-*r/ [=>]33.3 | \[ \color{blue}{\frac{100 \cdot \left({\left(1 + \frac{i}{n}\right)}^{n} - 1\right)}{\frac{i}{n}}}
\] |
sub-neg [=>]33.3 | \[ \frac{100 \cdot \color{blue}{\left({\left(1 + \frac{i}{n}\right)}^{n} + \left(-1\right)\right)}}{\frac{i}{n}}
\] |
metadata-eval [=>]33.3 | \[ \frac{100 \cdot \left({\left(1 + \frac{i}{n}\right)}^{n} + \color{blue}{-1}\right)}{\frac{i}{n}}
\] |
Taylor expanded in n around 0 19.6
Simplified19.6
[Start]19.6 | \[ \frac{100 \cdot \left(n \cdot \left(-1 \cdot \log n + \log i\right)\right)}{\frac{i}{n}}
\] |
|---|---|
associate-*r* [=>]19.6 | \[ \frac{\color{blue}{\left(100 \cdot n\right) \cdot \left(-1 \cdot \log n + \log i\right)}}{\frac{i}{n}}
\] |
*-commutative [=>]19.6 | \[ \frac{\color{blue}{\left(n \cdot 100\right)} \cdot \left(-1 \cdot \log n + \log i\right)}{\frac{i}{n}}
\] |
associate-*l* [=>]19.6 | \[ \frac{\color{blue}{n \cdot \left(100 \cdot \left(-1 \cdot \log n + \log i\right)\right)}}{\frac{i}{n}}
\] |
+-commutative [=>]19.6 | \[ \frac{n \cdot \left(100 \cdot \color{blue}{\left(\log i + -1 \cdot \log n\right)}\right)}{\frac{i}{n}}
\] |
mul-1-neg [=>]19.6 | \[ \frac{n \cdot \left(100 \cdot \left(\log i + \color{blue}{\left(-\log n\right)}\right)\right)}{\frac{i}{n}}
\] |
unsub-neg [=>]19.6 | \[ \frac{n \cdot \left(100 \cdot \color{blue}{\left(\log i - \log n\right)}\right)}{\frac{i}{n}}
\] |
Final simplification10.8
| Alternative 1 | |
|---|---|
| Error | 10.8 |
| Cost | 13900 |
| Alternative 2 | |
|---|---|
| Error | 12.1 |
| Cost | 7244 |
| Alternative 3 | |
|---|---|
| Error | 11.9 |
| Cost | 7244 |
| Alternative 4 | |
|---|---|
| Error | 12.3 |
| Cost | 6980 |
| Alternative 5 | |
|---|---|
| Error | 19.6 |
| Cost | 976 |
| Alternative 6 | |
|---|---|
| Error | 19.3 |
| Cost | 969 |
| Alternative 7 | |
|---|---|
| Error | 19.9 |
| Cost | 844 |
| Alternative 8 | |
|---|---|
| Error | 19.9 |
| Cost | 712 |
| Alternative 9 | |
|---|---|
| Error | 20.2 |
| Cost | 456 |
| Alternative 10 | |
|---|---|
| Error | 50.7 |
| Cost | 64 |
herbie shell --seed 2023038
(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))))