100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}\begin{array}{l}
\mathbf{if}\;i \le -5.972711572932587 \cdot 10^{-05}:\\
\;\;\;\;\frac{\mathsf{fma}\left(100, e^{\mathsf{log1p}\left(\frac{i}{n}\right) \cdot n}, -100\right)}{i} \cdot n\\
\mathbf{elif}\;i \le 0.07870893021680746:\\
\;\;\;\;\frac{\mathsf{fma}\left(i, 100, \left(i \cdot i\right) \cdot \left(i \cdot \frac{50}{3} + 50\right)\right)}{\frac{i}{n}}\\
\mathbf{else}:\\
\;\;\;\;\frac{n}{i} \cdot \left(\left(\mathsf{fma}\left(50, \left(\log n \cdot n\right) \cdot \left(\log n \cdot n\right), \mathsf{fma}\left(\left(\left(\left(n \cdot \log i\right) \cdot \left(n \cdot \log i\right)\right) \cdot n\right) \cdot \log i, \frac{50}{3}, \mathsf{fma}\left(100, n \cdot \log i, \mathsf{fma}\left(\left(n \cdot \left(\left(\log n \cdot n\right) \cdot \left(\log n \cdot n\right)\right)\right) \cdot \log i, 50, \left(\left(n \cdot \log i\right) \cdot \left(n \cdot \log i\right)\right) \cdot 50\right)\right)\right)\right) - \left(\mathsf{fma}\left(\left(\log i \cdot \left(n \cdot n\right)\right) \cdot \log n, 100, \frac{50}{3} \cdot \left(\left(\log n \cdot n\right) \cdot \left(\left(\log n \cdot n\right) \cdot \left(\log n \cdot n\right)\right)\right)\right) + \frac{100}{3} \cdot \left(\left(\left(\left(n \cdot \log i\right) \cdot \left(n \cdot \log i\right)\right) \cdot n\right) \cdot \log n\right)\right)\right) - \left(\left(\left(\left(n \cdot \log i\right) \cdot \left(n \cdot \log i\right)\right) \cdot n\right) \cdot \frac{50}{3} + 100 \cdot n\right) \cdot \log n\right)\\
\end{array}double f(double i, double n) {
double r5323998 = 100.0;
double r5323999 = 1.0;
double r5324000 = i;
double r5324001 = n;
double r5324002 = r5324000 / r5324001;
double r5324003 = r5323999 + r5324002;
double r5324004 = pow(r5324003, r5324001);
double r5324005 = r5324004 - r5323999;
double r5324006 = r5324005 / r5324002;
double r5324007 = r5323998 * r5324006;
return r5324007;
}
double f(double i, double n) {
double r5324008 = i;
double r5324009 = -5.972711572932587e-05;
bool r5324010 = r5324008 <= r5324009;
double r5324011 = 100.0;
double r5324012 = n;
double r5324013 = r5324008 / r5324012;
double r5324014 = log1p(r5324013);
double r5324015 = r5324014 * r5324012;
double r5324016 = exp(r5324015);
double r5324017 = -100.0;
double r5324018 = fma(r5324011, r5324016, r5324017);
double r5324019 = r5324018 / r5324008;
double r5324020 = r5324019 * r5324012;
double r5324021 = 0.07870893021680746;
bool r5324022 = r5324008 <= r5324021;
double r5324023 = r5324008 * r5324008;
double r5324024 = 16.666666666666668;
double r5324025 = r5324008 * r5324024;
double r5324026 = 50.0;
double r5324027 = r5324025 + r5324026;
double r5324028 = r5324023 * r5324027;
double r5324029 = fma(r5324008, r5324011, r5324028);
double r5324030 = r5324029 / r5324013;
double r5324031 = r5324012 / r5324008;
double r5324032 = log(r5324012);
double r5324033 = r5324032 * r5324012;
double r5324034 = r5324033 * r5324033;
double r5324035 = log(r5324008);
double r5324036 = r5324012 * r5324035;
double r5324037 = r5324036 * r5324036;
double r5324038 = r5324037 * r5324012;
double r5324039 = r5324038 * r5324035;
double r5324040 = r5324012 * r5324034;
double r5324041 = r5324040 * r5324035;
double r5324042 = r5324037 * r5324026;
double r5324043 = fma(r5324041, r5324026, r5324042);
double r5324044 = fma(r5324011, r5324036, r5324043);
double r5324045 = fma(r5324039, r5324024, r5324044);
double r5324046 = fma(r5324026, r5324034, r5324045);
double r5324047 = r5324012 * r5324012;
double r5324048 = r5324035 * r5324047;
double r5324049 = r5324048 * r5324032;
double r5324050 = r5324033 * r5324034;
double r5324051 = r5324024 * r5324050;
double r5324052 = fma(r5324049, r5324011, r5324051);
double r5324053 = 33.333333333333336;
double r5324054 = r5324038 * r5324032;
double r5324055 = r5324053 * r5324054;
double r5324056 = r5324052 + r5324055;
double r5324057 = r5324046 - r5324056;
double r5324058 = r5324038 * r5324024;
double r5324059 = r5324011 * r5324012;
double r5324060 = r5324058 + r5324059;
double r5324061 = r5324060 * r5324032;
double r5324062 = r5324057 - r5324061;
double r5324063 = r5324031 * r5324062;
double r5324064 = r5324022 ? r5324030 : r5324063;
double r5324065 = r5324010 ? r5324020 : r5324064;
return r5324065;
}




Bits error versus i




Bits error versus n
| Original | 42.1 |
|---|---|
| Target | 41.8 |
| Herbie | 24.8 |
if i < -5.972711572932587e-05Initial program 28.3
Simplified28.2
rmApplied add-exp-log28.3
Applied pow-exp28.3
Simplified5.4
rmApplied associate-/r/6.0
if -5.972711572932587e-05 < i < 0.07870893021680746Initial program 49.9
Simplified49.9
Taylor expanded around 0 32.7
Simplified32.7
if 0.07870893021680746 < i Initial program 30.1
Simplified30.1
rmApplied add-exp-log49.4
Applied pow-exp49.4
Simplified48.6
rmApplied div-inv48.6
Simplified48.6
Taylor expanded around 0 21.2
Simplified21.2
Final simplification24.8
herbie shell --seed 2019162 +o rules:numerics
(FPCore (i n)
:name "Compound Interest"
:herbie-target
(* 100 (/ (- (exp (* n (if (== (+ 1 (/ i n)) 1) (/ i n) (/ (* (/ i n) (log (+ 1 (/ i n)))) (- (+ (/ i n) 1) 1))))) 1) (/ i n)))
(* 100 (/ (- (pow (+ 1 (/ i n)) n) 1) (/ i n))))