Average Error: 47.6 → 14.7
Time: 14.4s
Precision: binary64
\[\]
\[\]
double code(double i, double n) {
	return ((double) (100.0 * ((double) (((double) (((double) pow(((double) (1.0 + ((double) (i / n)))), n)) - 1.0)) / ((double) (i / n))))));
}
double code(double i, double n) {
	double VAR;
	if ((i <= -9.043975738872494e-10)) {
		VAR = ((double) (100.0 * ((double) (n * ((double) (((double) (((double) pow(((double) (i / n)), n)) - 1.0)) / i))))));
	} else {
		double VAR_1;
		if ((i <= 0.04307656589136779)) {
			VAR_1 = ((double) (100.0 * ((double) (((double) (((double) (((double) cbrt(((double) (((double) (i * 1.0)) + ((double) (((double) (n * ((double) log(1.0)))) + ((double) (((double) (i * i)) * ((double) (0.5 - ((double) (((double) log(1.0)) * 0.5)))))))))))) / ((double) cbrt(i)))) * ((double) (((double) cbrt(((double) (((double) (i * 1.0)) + ((double) (((double) (n * ((double) log(1.0)))) + ((double) (((double) (i * i)) * ((double) (0.5 - ((double) (((double) log(1.0)) * 0.5)))))))))))) / ((double) cbrt(i)))))) * ((double) (n * ((double) (((double) cbrt(((double) (((double) (i * 1.0)) + ((double) (((double) (n * ((double) log(1.0)))) + ((double) (((double) (i * i)) * ((double) (0.5 - ((double) (((double) log(1.0)) * 0.5)))))))))))) / ((double) cbrt(i))))))))));
		} else {
			double VAR_2;
			if ((i <= 6.213782009528768e+209)) {
				VAR_2 = ((double) (100.0 * ((double) (((double) (((double) (((double) pow(((double) (((double) (i / n)) + 1.0)), ((double) (n * 2.0)))) - ((double) (1.0 * 1.0)))) / ((double) (1.0 + ((double) pow(((double) (((double) (i / n)) + 1.0)), n)))))) / ((double) (i / n))))));
			} else {
				VAR_2 = ((double) (100.0 * ((double) (((double) (((double) (1.0 + ((double) (((double) (i * 1.0)) + ((double) (n * ((double) log(1.0)))))))) - 1.0)) / ((double) (i / n))))));
			}
			VAR_1 = VAR_2;
		}
		VAR = VAR_1;
	}
	return VAR;
}

Error

Bits error versus i

Bits error versus n

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original47.6
Target47.5
Herbie14.7
\[\]

Derivation

  1. Split input into 4 regimes
  2. if i < -9.04397573887249397e-10

    1. Initial program 28.5

      \[\]
    2. Taylor expanded around inf 64.0

      \[\leadsto \]
    3. Simplified19.7

      \[\leadsto \]

    if -9.04397573887249397e-10 < i < 0.0430765658913677893

    1. Initial program 58.2

      \[\]
    2. Taylor expanded around 0 25.9

      \[\leadsto \]
    3. Simplified25.9

      \[\leadsto \]
    4. Using strategy rm
    5. Applied *-un-lft-identity25.9

      \[\leadsto \]
    6. Applied add-cube-cbrt26.7

      \[\leadsto \]
    7. Applied times-frac26.7

      \[\leadsto \]
    8. Applied add-cube-cbrt26.1

      \[\leadsto \]
    9. Applied times-frac13.8

      \[\leadsto \]
    10. Simplified13.8

      \[\leadsto \]
    11. Simplified9.3

      \[\leadsto \]

    if 0.0430765658913677893 < i < 6.2137820095287683e209

    1. Initial program 30.1

      \[\]
    2. Using strategy rm
    3. Applied flip--30.1

      \[\leadsto \]
    4. Simplified30.0

      \[\leadsto \]
    5. Simplified30.0

      \[\leadsto \]

    if 6.2137820095287683e209 < i

    1. Initial program 32.6

      \[\]
    2. Taylor expanded around 0 33.7

      \[\leadsto \]
    3. Simplified33.7

      \[\leadsto \]
  3. Recombined 4 regimes into one program.
  4. Final simplification14.7

    \[\leadsto \]

Reproduce

herbie shell --seed 2020192 
(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))))