100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}\begin{array}{l}
\mathbf{if}\;i \le -0.5511580558700998055954300980374682694674:\\
\;\;\;\;100 \cdot \frac{\frac{{\left(1 + \frac{i}{n}\right)}^{\left(2 \cdot n\right)} + \left(-1 \cdot 1\right)}{{\left(1 + \frac{i}{n}\right)}^{n} + 1}}{\frac{i}{n}}\\
\mathbf{elif}\;i \le 6.118499728754747261555536370589189972005 \cdot 10^{-197}:\\
\;\;\;\;100 \cdot \left(\left(\left(\sqrt[3]{\frac{\mathsf{fma}\left(i, 1, \mathsf{fma}\left(0.5, {i}^{2}, \log 1 \cdot n\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)\right)}{i}} \cdot \sqrt[3]{\frac{\mathsf{fma}\left(i, 1, \mathsf{fma}\left(0.5, {i}^{2}, \log 1 \cdot n\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)\right)}{i}}\right) \cdot \sqrt[3]{\frac{\mathsf{fma}\left(i, 1, \mathsf{fma}\left(0.5, {i}^{2}, \log 1 \cdot n\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)\right)}{i}}\right) \cdot n\right)\\
\mathbf{elif}\;i \le 8648182.72403052262961864471435546875:\\
\;\;\;\;\frac{100 \cdot \left(\mathsf{fma}\left(i, 1, \mathsf{fma}\left(0.5, {i}^{2}, \log 1 \cdot n\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)\right) \cdot n\right)}{i}\\
\mathbf{else}:\\
\;\;\;\;100 \cdot \frac{\frac{{\left(1 + \frac{i}{n}\right)}^{\left(2 \cdot n\right)} + \left(-1 \cdot 1\right)}{{\left(1 + \frac{i}{n}\right)}^{n} + 1}}{\frac{i}{n}}\\
\end{array}double f(double i, double n) {
double r167016 = 100.0;
double r167017 = 1.0;
double r167018 = i;
double r167019 = n;
double r167020 = r167018 / r167019;
double r167021 = r167017 + r167020;
double r167022 = pow(r167021, r167019);
double r167023 = r167022 - r167017;
double r167024 = r167023 / r167020;
double r167025 = r167016 * r167024;
return r167025;
}
double f(double i, double n) {
double r167026 = i;
double r167027 = -0.5511580558700998;
bool r167028 = r167026 <= r167027;
double r167029 = 100.0;
double r167030 = 1.0;
double r167031 = n;
double r167032 = r167026 / r167031;
double r167033 = r167030 + r167032;
double r167034 = 2.0;
double r167035 = r167034 * r167031;
double r167036 = pow(r167033, r167035);
double r167037 = r167030 * r167030;
double r167038 = -r167037;
double r167039 = r167036 + r167038;
double r167040 = pow(r167033, r167031);
double r167041 = r167040 + r167030;
double r167042 = r167039 / r167041;
double r167043 = r167042 / r167032;
double r167044 = r167029 * r167043;
double r167045 = 6.118499728754747e-197;
bool r167046 = r167026 <= r167045;
double r167047 = 0.5;
double r167048 = pow(r167026, r167034);
double r167049 = log(r167030);
double r167050 = r167049 * r167031;
double r167051 = fma(r167047, r167048, r167050);
double r167052 = r167048 * r167049;
double r167053 = r167047 * r167052;
double r167054 = r167051 - r167053;
double r167055 = fma(r167026, r167030, r167054);
double r167056 = r167055 / r167026;
double r167057 = cbrt(r167056);
double r167058 = r167057 * r167057;
double r167059 = r167058 * r167057;
double r167060 = r167059 * r167031;
double r167061 = r167029 * r167060;
double r167062 = 8648182.724030523;
bool r167063 = r167026 <= r167062;
double r167064 = r167055 * r167031;
double r167065 = r167029 * r167064;
double r167066 = r167065 / r167026;
double r167067 = r167063 ? r167066 : r167044;
double r167068 = r167046 ? r167061 : r167067;
double r167069 = r167028 ? r167044 : r167068;
return r167069;
}




Bits error versus i




Bits error versus n
| Original | 42.9 |
|---|---|
| Target | 43.1 |
| Herbie | 20.5 |
if i < -0.5511580558700998 or 8648182.724030523 < i Initial program 28.3
rmApplied flip--28.4
Simplified28.4
if -0.5511580558700998 < i < 6.118499728754747e-197Initial program 50.7
Taylor expanded around 0 35.9
Simplified35.9
rmApplied associate-/r/16.3
rmApplied add-cube-cbrt16.3
if 6.118499728754747e-197 < i < 8648182.724030523Initial program 51.0
Taylor expanded around 0 29.9
Simplified29.9
rmApplied associate-/r/19.0
rmApplied associate-*l/16.1
Applied associate-*r/16.2
Final simplification20.5
herbie shell --seed 2019362 +o rules:numerics
(FPCore (i n)
:name "Compound Interest"
:precision binary64
: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))))