Average Error: 42.1 → 15.7
Time: 4.1m
Precision: 64
\[100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}\]
\[\begin{array}{l} \mathbf{if}\;i \le -2.8864238159165176 \cdot 10^{-08}:\\ \;\;\;\;100 \cdot \frac{e^{\mathsf{log1p}\left(\left(\frac{i}{n}\right)\right) \cdot n} - 1}{\frac{i}{n}}\\ \mathbf{elif}\;i \le 7.15448981312837 \cdot 10^{-86}:\\ \;\;\;\;100 \cdot \left(n \cdot \mathsf{fma}\left(\left(\mathsf{fma}\left(\frac{1}{6}, i, \frac{1}{2}\right)\right), i, 1\right)\right)\\ \mathbf{elif}\;i \le 1.5900402459407238 \cdot 10^{-78}:\\ \;\;\;\;100 \cdot \frac{\mathsf{expm1}\left(\left(n \cdot \log \left(\frac{i}{n} + 1\right)\right)\right)}{\frac{i}{n}}\\ \mathbf{elif}\;i \le 516.8120698284489:\\ \;\;\;\;100 \cdot \left(n \cdot \mathsf{fma}\left(\left(\mathsf{fma}\left(\frac{1}{6}, i, \frac{1}{2}\right)\right), i, 1\right)\right)\\ \mathbf{elif}\;i \le 1.087190514253047 \cdot 10^{+133}:\\ \;\;\;\;\frac{n \cdot \mathsf{expm1}\left(\left(\left(\log i - \log n\right) \cdot n\right)\right)}{\frac{i}{100}}\\ \mathbf{elif}\;i \le 1.6189234541938694 \cdot 10^{+242}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\left({\left(\frac{\frac{-1}{n}}{\frac{-1}{i}}\right)}^{n}\right), 100, -100\right)}{\frac{i}{n}}\\ \mathbf{else}:\\ \;\;\;\;\frac{n \cdot \mathsf{expm1}\left(\left(\left(\log i - \log n\right) \cdot n\right)\right)}{\frac{i}{100}}\\ \end{array}\]
100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}
\begin{array}{l}
\mathbf{if}\;i \le -2.8864238159165176 \cdot 10^{-08}:\\
\;\;\;\;100 \cdot \frac{e^{\mathsf{log1p}\left(\left(\frac{i}{n}\right)\right) \cdot n} - 1}{\frac{i}{n}}\\

\mathbf{elif}\;i \le 7.15448981312837 \cdot 10^{-86}:\\
\;\;\;\;100 \cdot \left(n \cdot \mathsf{fma}\left(\left(\mathsf{fma}\left(\frac{1}{6}, i, \frac{1}{2}\right)\right), i, 1\right)\right)\\

\mathbf{elif}\;i \le 1.5900402459407238 \cdot 10^{-78}:\\
\;\;\;\;100 \cdot \frac{\mathsf{expm1}\left(\left(n \cdot \log \left(\frac{i}{n} + 1\right)\right)\right)}{\frac{i}{n}}\\

\mathbf{elif}\;i \le 516.8120698284489:\\
\;\;\;\;100 \cdot \left(n \cdot \mathsf{fma}\left(\left(\mathsf{fma}\left(\frac{1}{6}, i, \frac{1}{2}\right)\right), i, 1\right)\right)\\

\mathbf{elif}\;i \le 1.087190514253047 \cdot 10^{+133}:\\
\;\;\;\;\frac{n \cdot \mathsf{expm1}\left(\left(\left(\log i - \log n\right) \cdot n\right)\right)}{\frac{i}{100}}\\

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

\mathbf{else}:\\
\;\;\;\;\frac{n \cdot \mathsf{expm1}\left(\left(\left(\log i - \log n\right) \cdot n\right)\right)}{\frac{i}{100}}\\

\end{array}
double f(double i, double n) {
        double r47920495 = 100.0;
        double r47920496 = 1.0;
        double r47920497 = i;
        double r47920498 = n;
        double r47920499 = r47920497 / r47920498;
        double r47920500 = r47920496 + r47920499;
        double r47920501 = pow(r47920500, r47920498);
        double r47920502 = r47920501 - r47920496;
        double r47920503 = r47920502 / r47920499;
        double r47920504 = r47920495 * r47920503;
        return r47920504;
}

double f(double i, double n) {
        double r47920505 = i;
        double r47920506 = -2.8864238159165176e-08;
        bool r47920507 = r47920505 <= r47920506;
        double r47920508 = 100.0;
        double r47920509 = n;
        double r47920510 = r47920505 / r47920509;
        double r47920511 = log1p(r47920510);
        double r47920512 = r47920511 * r47920509;
        double r47920513 = exp(r47920512);
        double r47920514 = 1.0;
        double r47920515 = r47920513 - r47920514;
        double r47920516 = r47920515 / r47920510;
        double r47920517 = r47920508 * r47920516;
        double r47920518 = 7.15448981312837e-86;
        bool r47920519 = r47920505 <= r47920518;
        double r47920520 = 0.16666666666666666;
        double r47920521 = 0.5;
        double r47920522 = fma(r47920520, r47920505, r47920521);
        double r47920523 = fma(r47920522, r47920505, r47920514);
        double r47920524 = r47920509 * r47920523;
        double r47920525 = r47920508 * r47920524;
        double r47920526 = 1.5900402459407238e-78;
        bool r47920527 = r47920505 <= r47920526;
        double r47920528 = r47920510 + r47920514;
        double r47920529 = log(r47920528);
        double r47920530 = r47920509 * r47920529;
        double r47920531 = expm1(r47920530);
        double r47920532 = r47920531 / r47920510;
        double r47920533 = r47920508 * r47920532;
        double r47920534 = 516.8120698284489;
        bool r47920535 = r47920505 <= r47920534;
        double r47920536 = 1.087190514253047e+133;
        bool r47920537 = r47920505 <= r47920536;
        double r47920538 = log(r47920505);
        double r47920539 = log(r47920509);
        double r47920540 = r47920538 - r47920539;
        double r47920541 = r47920540 * r47920509;
        double r47920542 = expm1(r47920541);
        double r47920543 = r47920509 * r47920542;
        double r47920544 = r47920505 / r47920508;
        double r47920545 = r47920543 / r47920544;
        double r47920546 = 1.6189234541938694e+242;
        bool r47920547 = r47920505 <= r47920546;
        double r47920548 = -1.0;
        double r47920549 = r47920548 / r47920509;
        double r47920550 = r47920548 / r47920505;
        double r47920551 = r47920549 / r47920550;
        double r47920552 = pow(r47920551, r47920509);
        double r47920553 = -100.0;
        double r47920554 = fma(r47920552, r47920508, r47920553);
        double r47920555 = r47920554 / r47920510;
        double r47920556 = r47920547 ? r47920555 : r47920545;
        double r47920557 = r47920537 ? r47920545 : r47920556;
        double r47920558 = r47920535 ? r47920525 : r47920557;
        double r47920559 = r47920527 ? r47920533 : r47920558;
        double r47920560 = r47920519 ? r47920525 : r47920559;
        double r47920561 = r47920507 ? r47920517 : r47920560;
        return r47920561;
}

Error

Bits error versus i

Bits error versus n

Target

Original42.1
Target41.6
Herbie15.7
\[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 5 regimes
  2. if i < -2.8864238159165176e-08

    1. Initial program 28.5

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

      \[\leadsto 100 \cdot \frac{{\color{blue}{\left(e^{\log \left(1 + \frac{i}{n}\right)}\right)}}^{n} - 1}{\frac{i}{n}}\]
    4. Applied pow-exp28.6

      \[\leadsto 100 \cdot \frac{\color{blue}{e^{\log \left(1 + \frac{i}{n}\right) \cdot n}} - 1}{\frac{i}{n}}\]
    5. Simplified5.8

      \[\leadsto 100 \cdot \frac{e^{\color{blue}{n \cdot \mathsf{log1p}\left(\left(\frac{i}{n}\right)\right)}} - 1}{\frac{i}{n}}\]

    if -2.8864238159165176e-08 < i < 7.15448981312837e-86 or 1.5900402459407238e-78 < i < 516.8120698284489

    1. Initial program 49.2

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

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

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

      \[\leadsto 100 \cdot \color{blue}{\left(\frac{\mathsf{fma}\left(\left(i \cdot \mathsf{fma}\left(i, \frac{1}{6}, \frac{1}{2}\right)\right), i, i\right)}{i} \cdot n\right)}\]
    6. Simplified18.0

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

    if 7.15448981312837e-86 < i < 1.5900402459407238e-78

    1. Initial program 49.1

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

      \[\leadsto 100 \cdot \frac{\color{blue}{e^{\log \left(1 + \frac{i}{n}\right) \cdot n}} - 1}{\frac{i}{n}}\]
    4. Applied expm1-def36.5

      \[\leadsto 100 \cdot \frac{\color{blue}{\mathsf{expm1}\left(\left(\log \left(1 + \frac{i}{n}\right) \cdot n\right)\right)}}{\frac{i}{n}}\]

    if 516.8120698284489 < i < 1.087190514253047e+133 or 1.6189234541938694e+242 < i

    1. Initial program 33.4

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

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

      \[\leadsto \color{blue}{\frac{\mathsf{expm1}\left(\left(n \cdot \left(\log i - \log n\right)\right)\right) \cdot n}{\frac{i}{100}}}\]

    if 1.087190514253047e+133 < i < 1.6189234541938694e+242

    1. Initial program 32.4

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

      \[\leadsto \color{blue}{100 \cdot \frac{n \cdot \left(e^{n \cdot \left(\log \left(\frac{-1}{n}\right) - \log \left(\frac{-1}{i}\right)\right)} - 1\right)}{i}}\]
    3. Simplified32.3

      \[\leadsto \color{blue}{\frac{\mathsf{fma}\left(\left({\left(\frac{\frac{-1}{n}}{\frac{-1}{i}}\right)}^{n}\right), 100, -100\right)}{\frac{i}{n}}}\]
  3. Recombined 5 regimes into one program.
  4. Final simplification15.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;i \le -2.8864238159165176 \cdot 10^{-08}:\\ \;\;\;\;100 \cdot \frac{e^{\mathsf{log1p}\left(\left(\frac{i}{n}\right)\right) \cdot n} - 1}{\frac{i}{n}}\\ \mathbf{elif}\;i \le 7.15448981312837 \cdot 10^{-86}:\\ \;\;\;\;100 \cdot \left(n \cdot \mathsf{fma}\left(\left(\mathsf{fma}\left(\frac{1}{6}, i, \frac{1}{2}\right)\right), i, 1\right)\right)\\ \mathbf{elif}\;i \le 1.5900402459407238 \cdot 10^{-78}:\\ \;\;\;\;100 \cdot \frac{\mathsf{expm1}\left(\left(n \cdot \log \left(\frac{i}{n} + 1\right)\right)\right)}{\frac{i}{n}}\\ \mathbf{elif}\;i \le 516.8120698284489:\\ \;\;\;\;100 \cdot \left(n \cdot \mathsf{fma}\left(\left(\mathsf{fma}\left(\frac{1}{6}, i, \frac{1}{2}\right)\right), i, 1\right)\right)\\ \mathbf{elif}\;i \le 1.087190514253047 \cdot 10^{+133}:\\ \;\;\;\;\frac{n \cdot \mathsf{expm1}\left(\left(\left(\log i - \log n\right) \cdot n\right)\right)}{\frac{i}{100}}\\ \mathbf{elif}\;i \le 1.6189234541938694 \cdot 10^{+242}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\left({\left(\frac{\frac{-1}{n}}{\frac{-1}{i}}\right)}^{n}\right), 100, -100\right)}{\frac{i}{n}}\\ \mathbf{else}:\\ \;\;\;\;\frac{n \cdot \mathsf{expm1}\left(\left(\left(\log i - \log n\right) \cdot n\right)\right)}{\frac{i}{100}}\\ \end{array}\]

Reproduce

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