Average Error: 42.8 → 19.7
Time: 51.8s
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 r6005782 = 100.0;
        double r6005783 = 1.0;
        double r6005784 = i;
        double r6005785 = n;
        double r6005786 = r6005784 / r6005785;
        double r6005787 = r6005783 + r6005786;
        double r6005788 = pow(r6005787, r6005785);
        double r6005789 = r6005788 - r6005783;
        double r6005790 = r6005789 / r6005786;
        double r6005791 = r6005782 * r6005790;
        return r6005791;
}

double f(double i, double n) {
        double r6005792 = i;
        double r6005793 = -5.1633600557877234e-11;
        bool r6005794 = r6005792 <= r6005793;
        double r6005795 = 1.0;
        double r6005796 = n;
        double r6005797 = r6005795 / r6005796;
        double r6005798 = r6005797 * r6005792;
        double r6005799 = pow(r6005798, r6005796);
        double r6005800 = 100.0;
        double r6005801 = r6005799 * r6005800;
        double r6005802 = r6005801 - r6005800;
        double r6005803 = r6005802 / r6005792;
        double r6005804 = r6005803 * r6005796;
        double r6005805 = 6.305809243265488e-10;
        bool r6005806 = r6005792 <= r6005805;
        double r6005807 = 0.5;
        double r6005808 = r6005807 * r6005792;
        double r6005809 = 1.0;
        double r6005810 = log(r6005809);
        double r6005811 = r6005810 / r6005792;
        double r6005812 = fma(r6005811, r6005796, r6005809);
        double r6005813 = r6005810 * r6005808;
        double r6005814 = r6005812 - r6005813;
        double r6005815 = r6005808 + r6005814;
        double r6005816 = r6005800 * r6005815;
        double r6005817 = r6005796 * r6005816;
        double r6005818 = 2.5651303341965514e+190;
        bool r6005819 = r6005792 <= r6005818;
        double r6005820 = fma(r6005810, r6005796, r6005795);
        double r6005821 = fma(r6005809, r6005792, r6005820);
        double r6005822 = r6005821 - r6005809;
        double r6005823 = r6005792 / r6005796;
        double r6005824 = r6005822 / r6005823;
        double r6005825 = r6005824 * r6005800;
        double r6005826 = r6005819 ? r6005804 : r6005825;
        double r6005827 = r6005806 ? r6005817 : r6005826;
        double r6005828 = r6005794 ? r6005804 : r6005827;
        return r6005828;
}

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))))