100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}\begin{array}{l}
\mathbf{if}\;i \le -0.008529206764181104793998144941724603995681 \lor \neg \left(i \le 4.039962480132392563803023222135379910469\right):\\
\;\;\;\;100 \cdot \frac{\frac{{\left(\frac{i}{n} + 1\right)}^{\left(n \cdot 2\right)} - 1 \cdot 1}{1 + {\left(\frac{i}{n} + 1\right)}^{n}}}{\frac{i}{n}}\\
\mathbf{else}:\\
\;\;\;\;100 \cdot \left(n \cdot \frac{\mathsf{fma}\left(n, \log 1, \left(0.5 \cdot i + 1\right) \cdot i\right)}{i} - n \cdot \frac{\log 1 \cdot \left(\left(i \cdot i\right) \cdot 0.5\right)}{i}\right)\\
\end{array}double f(double i, double n) {
double r182077 = 100.0;
double r182078 = 1.0;
double r182079 = i;
double r182080 = n;
double r182081 = r182079 / r182080;
double r182082 = r182078 + r182081;
double r182083 = pow(r182082, r182080);
double r182084 = r182083 - r182078;
double r182085 = r182084 / r182081;
double r182086 = r182077 * r182085;
return r182086;
}
double f(double i, double n) {
double r182087 = i;
double r182088 = -0.008529206764181105;
bool r182089 = r182087 <= r182088;
double r182090 = 4.039962480132393;
bool r182091 = r182087 <= r182090;
double r182092 = !r182091;
bool r182093 = r182089 || r182092;
double r182094 = 100.0;
double r182095 = n;
double r182096 = r182087 / r182095;
double r182097 = 1.0;
double r182098 = r182096 + r182097;
double r182099 = 2.0;
double r182100 = r182095 * r182099;
double r182101 = pow(r182098, r182100);
double r182102 = r182097 * r182097;
double r182103 = r182101 - r182102;
double r182104 = pow(r182098, r182095);
double r182105 = r182097 + r182104;
double r182106 = r182103 / r182105;
double r182107 = r182106 / r182096;
double r182108 = r182094 * r182107;
double r182109 = log(r182097);
double r182110 = 0.5;
double r182111 = r182110 * r182087;
double r182112 = r182111 + r182097;
double r182113 = r182112 * r182087;
double r182114 = fma(r182095, r182109, r182113);
double r182115 = r182114 / r182087;
double r182116 = r182095 * r182115;
double r182117 = r182087 * r182087;
double r182118 = r182117 * r182110;
double r182119 = r182109 * r182118;
double r182120 = r182119 / r182087;
double r182121 = r182095 * r182120;
double r182122 = r182116 - r182121;
double r182123 = r182094 * r182122;
double r182124 = r182093 ? r182108 : r182123;
return r182124;
}




Bits error versus i




Bits error versus n
| Original | 43.1 |
|---|---|
| Target | 42.9 |
| Herbie | 21.5 |
if i < -0.008529206764181105 or 4.039962480132393 < i Initial program 30.1
rmApplied flip--30.1
Simplified30.0
Simplified30.0
if -0.008529206764181105 < i < 4.039962480132393Initial program 50.8
Taylor expanded around 0 33.6
Simplified33.6
rmApplied div-sub33.6
Simplified32.9
Simplified16.4
Final simplification21.5
herbie shell --seed 2019174 +o rules:numerics
(FPCore (i n)
:name "Compound Interest"
: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))))