Average Error: 43.1 → 21.0
Time: 22.4s
Precision: 64
\[100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}\]
\[\begin{array}{l} \mathbf{if}\;n \le -2.346652527723265269088415152509696781635:\\ \;\;\;\;\left(100 \cdot \frac{\mathsf{fma}\left(1, i, \mathsf{fma}\left(0.5, {i}^{2}, \log 1 \cdot n\right)\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)}{i}\right) \cdot n\\ \mathbf{elif}\;n \le 5.321174585513155719949917669658167093164 \cdot 10^{-285}:\\ \;\;\;\;100 \cdot \frac{{\left({\left(1 + \frac{i}{n}\right)}^{\left(\sqrt[3]{n} \cdot \sqrt[3]{n}\right)}\right)}^{\left(\sqrt[3]{n}\right)} - 1}{\frac{i}{n}}\\ \mathbf{elif}\;n \le 3.089742171439268069923790151154466595501 \cdot 10^{-181}:\\ \;\;\;\;100 \cdot \frac{\mathsf{fma}\left(1, i, \mathsf{fma}\left(\log 1, n, 1\right)\right) - 1}{\frac{i}{n}}\\ \mathbf{else}:\\ \;\;\;\;\left(100 \cdot \frac{\mathsf{fma}\left(1, i, \mathsf{fma}\left(0.5, {i}^{2}, \log 1 \cdot n\right)\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)}{i}\right) \cdot n\\ \end{array}\]
100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}
\begin{array}{l}
\mathbf{if}\;n \le -2.346652527723265269088415152509696781635:\\
\;\;\;\;\left(100 \cdot \frac{\mathsf{fma}\left(1, i, \mathsf{fma}\left(0.5, {i}^{2}, \log 1 \cdot n\right)\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)}{i}\right) \cdot n\\

\mathbf{elif}\;n \le 5.321174585513155719949917669658167093164 \cdot 10^{-285}:\\
\;\;\;\;100 \cdot \frac{{\left({\left(1 + \frac{i}{n}\right)}^{\left(\sqrt[3]{n} \cdot \sqrt[3]{n}\right)}\right)}^{\left(\sqrt[3]{n}\right)} - 1}{\frac{i}{n}}\\

\mathbf{elif}\;n \le 3.089742171439268069923790151154466595501 \cdot 10^{-181}:\\
\;\;\;\;100 \cdot \frac{\mathsf{fma}\left(1, i, \mathsf{fma}\left(\log 1, n, 1\right)\right) - 1}{\frac{i}{n}}\\

\mathbf{else}:\\
\;\;\;\;\left(100 \cdot \frac{\mathsf{fma}\left(1, i, \mathsf{fma}\left(0.5, {i}^{2}, \log 1 \cdot n\right)\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)}{i}\right) \cdot n\\

\end{array}
double f(double i, double n) {
        double r140502 = 100.0;
        double r140503 = 1.0;
        double r140504 = i;
        double r140505 = n;
        double r140506 = r140504 / r140505;
        double r140507 = r140503 + r140506;
        double r140508 = pow(r140507, r140505);
        double r140509 = r140508 - r140503;
        double r140510 = r140509 / r140506;
        double r140511 = r140502 * r140510;
        return r140511;
}

double f(double i, double n) {
        double r140512 = n;
        double r140513 = -2.3466525277232653;
        bool r140514 = r140512 <= r140513;
        double r140515 = 100.0;
        double r140516 = 1.0;
        double r140517 = i;
        double r140518 = 0.5;
        double r140519 = 2.0;
        double r140520 = pow(r140517, r140519);
        double r140521 = log(r140516);
        double r140522 = r140521 * r140512;
        double r140523 = fma(r140518, r140520, r140522);
        double r140524 = fma(r140516, r140517, r140523);
        double r140525 = r140520 * r140521;
        double r140526 = r140518 * r140525;
        double r140527 = r140524 - r140526;
        double r140528 = r140527 / r140517;
        double r140529 = r140515 * r140528;
        double r140530 = r140529 * r140512;
        double r140531 = 5.321174585513156e-285;
        bool r140532 = r140512 <= r140531;
        double r140533 = r140517 / r140512;
        double r140534 = r140516 + r140533;
        double r140535 = cbrt(r140512);
        double r140536 = r140535 * r140535;
        double r140537 = pow(r140534, r140536);
        double r140538 = pow(r140537, r140535);
        double r140539 = r140538 - r140516;
        double r140540 = r140539 / r140533;
        double r140541 = r140515 * r140540;
        double r140542 = 3.089742171439268e-181;
        bool r140543 = r140512 <= r140542;
        double r140544 = 1.0;
        double r140545 = fma(r140521, r140512, r140544);
        double r140546 = fma(r140516, r140517, r140545);
        double r140547 = r140546 - r140516;
        double r140548 = r140547 / r140533;
        double r140549 = r140515 * r140548;
        double r140550 = r140543 ? r140549 : r140530;
        double r140551 = r140532 ? r140541 : r140550;
        double r140552 = r140514 ? r140530 : r140551;
        return r140552;
}

Error

Bits error versus i

Bits error versus n

Target

Original43.1
Target43.3
Herbie21.0
\[100 \cdot \frac{e^{n \cdot \begin{array}{l} \mathbf{if}\;1 + \frac{i}{n} = 1:\\ \;\;\;\;\frac{i}{n}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{i}{n} \cdot \log \left(1 + \frac{i}{n}\right)}{\left(\frac{i}{n} + 1\right) - 1}\\ \end{array}} - 1}{\frac{i}{n}}\]

Derivation

  1. Split input into 3 regimes
  2. if n < -2.3466525277232653 or 3.089742171439268e-181 < n

    1. Initial program 52.9

      \[100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}\]
    2. Taylor expanded around 0 39.0

      \[\leadsto 100 \cdot \frac{\color{blue}{\left(1 \cdot i + \left(0.5 \cdot {i}^{2} + \log 1 \cdot n\right)\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)}}{\frac{i}{n}}\]
    3. Simplified39.0

      \[\leadsto 100 \cdot \frac{\color{blue}{\mathsf{fma}\left(1, i, \mathsf{fma}\left(0.5, {i}^{2}, \log 1 \cdot n\right)\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)}}{\frac{i}{n}}\]
    4. Using strategy rm
    5. Applied associate-/r/22.3

      \[\leadsto 100 \cdot \color{blue}{\left(\frac{\mathsf{fma}\left(1, i, \mathsf{fma}\left(0.5, {i}^{2}, \log 1 \cdot n\right)\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)}{i} \cdot n\right)}\]
    6. Applied associate-*r*22.3

      \[\leadsto \color{blue}{\left(100 \cdot \frac{\mathsf{fma}\left(1, i, \mathsf{fma}\left(0.5, {i}^{2}, \log 1 \cdot n\right)\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)}{i}\right) \cdot n}\]

    if -2.3466525277232653 < n < 5.321174585513156e-285

    1. Initial program 15.2

      \[100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}\]
    2. Using strategy rm
    3. Applied add-cube-cbrt15.2

      \[\leadsto 100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{\color{blue}{\left(\left(\sqrt[3]{n} \cdot \sqrt[3]{n}\right) \cdot \sqrt[3]{n}\right)}} - 1}{\frac{i}{n}}\]
    4. Applied pow-unpow15.2

      \[\leadsto 100 \cdot \frac{\color{blue}{{\left({\left(1 + \frac{i}{n}\right)}^{\left(\sqrt[3]{n} \cdot \sqrt[3]{n}\right)}\right)}^{\left(\sqrt[3]{n}\right)}} - 1}{\frac{i}{n}}\]

    if 5.321174585513156e-285 < n < 3.089742171439268e-181

    1. Initial program 41.9

      \[100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}\]
    2. Taylor expanded around 0 27.6

      \[\leadsto 100 \cdot \frac{\color{blue}{\left(1 \cdot i + \left(\log 1 \cdot n + 1\right)\right)} - 1}{\frac{i}{n}}\]
    3. Simplified27.6

      \[\leadsto 100 \cdot \frac{\color{blue}{\mathsf{fma}\left(1, i, \mathsf{fma}\left(\log 1, n, 1\right)\right)} - 1}{\frac{i}{n}}\]
  3. Recombined 3 regimes into one program.
  4. Final simplification21.0

    \[\leadsto \begin{array}{l} \mathbf{if}\;n \le -2.346652527723265269088415152509696781635:\\ \;\;\;\;\left(100 \cdot \frac{\mathsf{fma}\left(1, i, \mathsf{fma}\left(0.5, {i}^{2}, \log 1 \cdot n\right)\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)}{i}\right) \cdot n\\ \mathbf{elif}\;n \le 5.321174585513155719949917669658167093164 \cdot 10^{-285}:\\ \;\;\;\;100 \cdot \frac{{\left({\left(1 + \frac{i}{n}\right)}^{\left(\sqrt[3]{n} \cdot \sqrt[3]{n}\right)}\right)}^{\left(\sqrt[3]{n}\right)} - 1}{\frac{i}{n}}\\ \mathbf{elif}\;n \le 3.089742171439268069923790151154466595501 \cdot 10^{-181}:\\ \;\;\;\;100 \cdot \frac{\mathsf{fma}\left(1, i, \mathsf{fma}\left(\log 1, n, 1\right)\right) - 1}{\frac{i}{n}}\\ \mathbf{else}:\\ \;\;\;\;\left(100 \cdot \frac{\mathsf{fma}\left(1, i, \mathsf{fma}\left(0.5, {i}^{2}, \log 1 \cdot n\right)\right) - 0.5 \cdot \left({i}^{2} \cdot \log 1\right)}{i}\right) \cdot n\\ \end{array}\]

Reproduce

herbie shell --seed 2019351 +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))))