Average Error: 45.6 → 45.0
Time: 10.7s
Precision: binary64
\[-\frac{\left(pmt \cdot \left(1 + r \cdot bgn\right)\right) \cdot \left({\left(1 + r\right)}^{n} - 1\right)}{r}\]
\[\begin{array}{l} \mathbf{if}\;\frac{\left(pmt \cdot \left(1 + r \cdot bgn\right)\right) \cdot \left({\left(1 + r\right)}^{n} - 1\right)}{r} \le 2.4078513355521659 \cdot 10^{-76}:\\ \;\;\;\;-\frac{\left(pmt \cdot \left(1 + r \cdot bgn\right)\right) \cdot \left({\left(1 + r\right)}^{n} - 1\right)}{r}\\ \mathbf{else}:\\ \;\;\;\;\left(\left(1 - {\left(1 + r\right)}^{n}\right) \cdot \frac{pmt}{r}\right) \cdot \left(1 + r \cdot bgn\right)\\ \end{array}\]

Error

Bits error versus pmt

Bits error versus r

Bits error versus bgn

Bits error versus n

Derivation

  1. Split input into 2 regimes
  2. if (/ (* (* pmt (+ 1.0 (* r bgn))) (- (pow (+ 1.0 r) n) 1.0)) r) < 2.4078513355521659e-76

    1. Initial program 45.0

      \[-\frac{\left(pmt \cdot \left(1 + r \cdot bgn\right)\right) \cdot \left({\left(1 + r\right)}^{n} - 1\right)}{r}\]

    if 2.4078513355521659e-76 < (/ (* (* pmt (+ 1.0 (* r bgn))) (- (pow (+ 1.0 r) n) 1.0)) r)

    1. Initial program 49.6

      \[-\frac{\left(pmt \cdot \left(1 + r \cdot bgn\right)\right) \cdot \left({\left(1 + r\right)}^{n} - 1\right)}{r}\]
    2. Simplified44.7

      \[\leadsto \color{blue}{\left(\left(1 - {\left(1 + r\right)}^{n}\right) \cdot \frac{pmt}{r}\right) \cdot \left(1 + r \cdot bgn\right)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification45.0

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{\left(pmt \cdot \left(1 + r \cdot bgn\right)\right) \cdot \left({\left(1 + r\right)}^{n} - 1\right)}{r} \le 2.4078513355521659 \cdot 10^{-76}:\\ \;\;\;\;-\frac{\left(pmt \cdot \left(1 + r \cdot bgn\right)\right) \cdot \left({\left(1 + r\right)}^{n} - 1\right)}{r}\\ \mathbf{else}:\\ \;\;\;\;\left(\left(1 - {\left(1 + r\right)}^{n}\right) \cdot \frac{pmt}{r}\right) \cdot \left(1 + r \cdot bgn\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2020152 
(FPCore (pmt r bgn n)
  :name "(- (/ (* (* pmt (+ 1 (* r bgn))) (- (pow (+ 1 r) n) 1)) r))"
  :precision binary64
  (neg (/ (* (* pmt (+ 1.0 (* r bgn))) (- (pow (+ 1.0 r) n) 1.0)) r)))