Average Error: 42.8 → 19.7
Time: 1.0m
Precision: 64
\[100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}\]
\[\begin{array}{l} \mathbf{if}\;i \le -5.163360055787723405136702348322010579229 \cdot 10^{-11}:\\ \;\;\;\;\frac{{\left(\frac{1}{n} \cdot i\right)}^{n} \cdot 100 - 100}{i} \cdot n\\ \mathbf{elif}\;i \le 6.305809243265488292923253978118289242438 \cdot 10^{-10}:\\ \;\;\;\;n \cdot \left(100 \cdot \left(0.5 \cdot i + \left(\mathsf{fma}\left(\frac{\log 1}{i}, n, 1\right) - \log 1 \cdot \left(0.5 \cdot i\right)\right)\right)\right)\\ \mathbf{elif}\;i \le 2.565130334196551364557031790272495063197 \cdot 10^{190}:\\ \;\;\;\;\frac{{\left(\frac{1}{n} \cdot i\right)}^{n} \cdot 100 - 100}{i} \cdot n\\ \mathbf{else}:\\ \;\;\;\;\frac{\mathsf{fma}\left(1, i, \mathsf{fma}\left(\log 1, n, 1\right)\right) - 1}{\frac{i}{n}} \cdot 100\\ \end{array}\]
100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}
\begin{array}{l}
\mathbf{if}\;i \le -5.163360055787723405136702348322010579229 \cdot 10^{-11}:\\
\;\;\;\;\frac{{\left(\frac{1}{n} \cdot i\right)}^{n} \cdot 100 - 100}{i} \cdot n\\

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

\mathbf{elif}\;i \le 2.565130334196551364557031790272495063197 \cdot 10^{190}:\\
\;\;\;\;\frac{{\left(\frac{1}{n} \cdot i\right)}^{n} \cdot 100 - 100}{i} \cdot n\\

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

\end{array}
double f(double i, double n) {
        double r7903614 = 100.0;
        double r7903615 = 1.0;
        double r7903616 = i;
        double r7903617 = n;
        double r7903618 = r7903616 / r7903617;
        double r7903619 = r7903615 + r7903618;
        double r7903620 = pow(r7903619, r7903617);
        double r7903621 = r7903620 - r7903615;
        double r7903622 = r7903621 / r7903618;
        double r7903623 = r7903614 * r7903622;
        return r7903623;
}

double f(double i, double n) {
        double r7903624 = i;
        double r7903625 = -5.1633600557877234e-11;
        bool r7903626 = r7903624 <= r7903625;
        double r7903627 = 1.0;
        double r7903628 = n;
        double r7903629 = r7903627 / r7903628;
        double r7903630 = r7903629 * r7903624;
        double r7903631 = pow(r7903630, r7903628);
        double r7903632 = 100.0;
        double r7903633 = r7903631 * r7903632;
        double r7903634 = r7903633 - r7903632;
        double r7903635 = r7903634 / r7903624;
        double r7903636 = r7903635 * r7903628;
        double r7903637 = 6.305809243265488e-10;
        bool r7903638 = r7903624 <= r7903637;
        double r7903639 = 0.5;
        double r7903640 = r7903639 * r7903624;
        double r7903641 = 1.0;
        double r7903642 = log(r7903641);
        double r7903643 = r7903642 / r7903624;
        double r7903644 = fma(r7903643, r7903628, r7903641);
        double r7903645 = r7903642 * r7903640;
        double r7903646 = r7903644 - r7903645;
        double r7903647 = r7903640 + r7903646;
        double r7903648 = r7903632 * r7903647;
        double r7903649 = r7903628 * r7903648;
        double r7903650 = 2.5651303341965514e+190;
        bool r7903651 = r7903624 <= r7903650;
        double r7903652 = fma(r7903642, r7903628, r7903627);
        double r7903653 = fma(r7903641, r7903624, r7903652);
        double r7903654 = r7903653 - r7903641;
        double r7903655 = r7903624 / r7903628;
        double r7903656 = r7903654 / r7903655;
        double r7903657 = r7903656 * r7903632;
        double r7903658 = r7903651 ? r7903636 : r7903657;
        double r7903659 = r7903638 ? r7903649 : r7903658;
        double r7903660 = r7903626 ? r7903636 : r7903659;
        return r7903660;
}

Error

Bits error versus i

Bits error versus n

Target

Original42.8
Target42.7
Herbie19.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 3 regimes
  2. if i < -5.1633600557877234e-11 or 6.305809243265488e-10 < i < 2.5651303341965514e+190

    1. Initial program 29.3

      \[100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}\]
    2. Using strategy rm
    3. Applied associate-/r/29.8

      \[\leadsto 100 \cdot \color{blue}{\left(\frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i} \cdot n\right)}\]
    4. Applied associate-*r*29.8

      \[\leadsto \color{blue}{\left(100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right) \cdot n}\]
    5. Taylor expanded around inf 55.4

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

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

    if -5.1633600557877234e-11 < i < 6.305809243265488e-10

    1. Initial program 50.7

      \[100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{\frac{i}{n}}\]
    2. Using strategy rm
    3. Applied associate-/r/50.4

      \[\leadsto 100 \cdot \color{blue}{\left(\frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i} \cdot n\right)}\]
    4. Applied associate-*r*50.4

      \[\leadsto \color{blue}{\left(100 \cdot \frac{{\left(1 + \frac{i}{n}\right)}^{n} - 1}{i}\right) \cdot n}\]
    5. Taylor expanded around 0 16.3

      \[\leadsto \left(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)}}{i}\right) \cdot n\]
    6. Simplified16.3

      \[\leadsto \left(100 \cdot \frac{\color{blue}{\mathsf{fma}\left(1, i, 0.5 \cdot \left(i \cdot i\right) + \log 1 \cdot \left(n - 0.5 \cdot \left(i \cdot i\right)\right)\right)}}{i}\right) \cdot n\]
    7. Taylor expanded around 0 16.3

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

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

    if 2.5651303341965514e+190 < i

    1. Initial program 33.1

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

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

      \[\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 simplification19.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;i \le -5.163360055787723405136702348322010579229 \cdot 10^{-11}:\\ \;\;\;\;\frac{{\left(\frac{1}{n} \cdot i\right)}^{n} \cdot 100 - 100}{i} \cdot n\\ \mathbf{elif}\;i \le 6.305809243265488292923253978118289242438 \cdot 10^{-10}:\\ \;\;\;\;n \cdot \left(100 \cdot \left(0.5 \cdot i + \left(\mathsf{fma}\left(\frac{\log 1}{i}, n, 1\right) - \log 1 \cdot \left(0.5 \cdot i\right)\right)\right)\right)\\ \mathbf{elif}\;i \le 2.565130334196551364557031790272495063197 \cdot 10^{190}:\\ \;\;\;\;\frac{{\left(\frac{1}{n} \cdot i\right)}^{n} \cdot 100 - 100}{i} \cdot n\\ \mathbf{else}:\\ \;\;\;\;\frac{\mathsf{fma}\left(1, i, \mathsf{fma}\left(\log 1, n, 1\right)\right) - 1}{\frac{i}{n}} \cdot 100\\ \end{array}\]

Reproduce

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