100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}\begin{array}{l}
\mathbf{if}\;n \le -5.946757000840379:\\
\;\;\;\;\frac{\mathsf{expm1}\left(i\right)}{i} \cdot \left(100 \cdot n\right)\\
\mathbf{elif}\;n \le -7.207093076091718 \cdot 10^{-232}:\\
\;\;\;\;100 \cdot \frac{1}{\frac{\frac{i}{n}}{\mathsf{expm1}\left(\mathsf{log1p}\left(\frac{i}{n}\right) \cdot n\right)}}\\
\mathbf{elif}\;n \le 7.328121567592983 \cdot 10^{-186}:\\
\;\;\;\;0\\
\mathbf{elif}\;n \le 228.0818158074512:\\
\;\;\;\;\frac{\mathsf{expm1}\left(\mathsf{log1p}\left(\frac{i}{n}\right) \cdot n\right)}{\frac{i}{n}} \cdot 100\\
\mathbf{else}:\\
\;\;\;\;\frac{\mathsf{expm1}\left(i\right)}{i} \cdot \left(100 \cdot n\right)\\
\end{array}double f(double i, double n) {
double r3720872 = 100.0;
double r3720873 = 1.0;
double r3720874 = i;
double r3720875 = n;
double r3720876 = r3720874 / r3720875;
double r3720877 = r3720873 + r3720876;
double r3720878 = pow(r3720877, r3720875);
double r3720879 = r3720878 - r3720873;
double r3720880 = r3720879 / r3720876;
double r3720881 = r3720872 * r3720880;
return r3720881;
}
double f(double i, double n) {
double r3720882 = n;
double r3720883 = -5.946757000840379;
bool r3720884 = r3720882 <= r3720883;
double r3720885 = i;
double r3720886 = expm1(r3720885);
double r3720887 = r3720886 / r3720885;
double r3720888 = 100.0;
double r3720889 = r3720888 * r3720882;
double r3720890 = r3720887 * r3720889;
double r3720891 = -7.207093076091718e-232;
bool r3720892 = r3720882 <= r3720891;
double r3720893 = 1.0;
double r3720894 = r3720885 / r3720882;
double r3720895 = log1p(r3720894);
double r3720896 = r3720895 * r3720882;
double r3720897 = expm1(r3720896);
double r3720898 = r3720894 / r3720897;
double r3720899 = r3720893 / r3720898;
double r3720900 = r3720888 * r3720899;
double r3720901 = 7.328121567592983e-186;
bool r3720902 = r3720882 <= r3720901;
double r3720903 = 0.0;
double r3720904 = 228.0818158074512;
bool r3720905 = r3720882 <= r3720904;
double r3720906 = r3720897 / r3720894;
double r3720907 = r3720906 * r3720888;
double r3720908 = r3720905 ? r3720907 : r3720890;
double r3720909 = r3720902 ? r3720903 : r3720908;
double r3720910 = r3720892 ? r3720900 : r3720909;
double r3720911 = r3720884 ? r3720890 : r3720910;
return r3720911;
}




Bits error versus i




Bits error versus n
Results
| Original | 42.9 |
|---|---|
| Target | 42.2 |
| Herbie | 10.6 |
if n < -5.946757000840379 or 228.0818158074512 < n Initial program 51.3
rmApplied add-exp-log55.8
Applied pow-exp55.8
Simplified44.9
Taylor expanded around inf 45.2
Simplified4.8
rmApplied *-un-lft-identity4.8
Applied times-frac4.8
Applied associate-*r*5.0
Simplified5.0
if -5.946757000840379 < n < -7.207093076091718e-232Initial program 17.0
rmApplied add-exp-log17.0
Applied pow-exp17.0
Simplified17.0
rmApplied clear-num17.0
Simplified27.5
if -7.207093076091718e-232 < n < 7.328121567592983e-186Initial program 30.6
Taylor expanded around 0 14.7
if 7.328121567592983e-186 < n < 228.0818158074512Initial program 53.5
rmApplied add-exp-log53.5
Applied pow-exp53.5
Simplified53.5
rmApplied *-un-lft-identity53.5
Applied *-un-lft-identity53.5
Applied times-frac53.5
Applied associate-/r*53.5
Simplified7.6
Final simplification10.6
herbie shell --seed 2019146 +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))))