Average Error: 58.5 → 0.7
Time: 6.5s
Precision: 64
\[\frac{1}{2} \cdot \log \left(\frac{1 + x}{1 - x}\right)\]
\[\frac{1}{2} \cdot \mathsf{fma}\left(\mathsf{fma}\left(x, x, x\right), 2, \log 1 - 2 \cdot \frac{{x}^{2}}{{1}^{2}}\right)\]
\frac{1}{2} \cdot \log \left(\frac{1 + x}{1 - x}\right)
\frac{1}{2} \cdot \mathsf{fma}\left(\mathsf{fma}\left(x, x, x\right), 2, \log 1 - 2 \cdot \frac{{x}^{2}}{{1}^{2}}\right)
double f(double x) {
        double r60514 = 1.0;
        double r60515 = 2.0;
        double r60516 = r60514 / r60515;
        double r60517 = x;
        double r60518 = r60514 + r60517;
        double r60519 = r60514 - r60517;
        double r60520 = r60518 / r60519;
        double r60521 = log(r60520);
        double r60522 = r60516 * r60521;
        return r60522;
}

double f(double x) {
        double r60523 = 1.0;
        double r60524 = 2.0;
        double r60525 = r60523 / r60524;
        double r60526 = x;
        double r60527 = fma(r60526, r60526, r60526);
        double r60528 = log(r60523);
        double r60529 = 2.0;
        double r60530 = pow(r60526, r60529);
        double r60531 = pow(r60523, r60529);
        double r60532 = r60530 / r60531;
        double r60533 = r60524 * r60532;
        double r60534 = r60528 - r60533;
        double r60535 = fma(r60527, r60524, r60534);
        double r60536 = r60525 * r60535;
        return r60536;
}

Error

Bits error versus x

Derivation

  1. Initial program 58.5

    \[\frac{1}{2} \cdot \log \left(\frac{1 + x}{1 - x}\right)\]
  2. Taylor expanded around 0 0.7

    \[\leadsto \frac{1}{2} \cdot \color{blue}{\left(\left(2 \cdot {x}^{2} + \left(2 \cdot x + \log 1\right)\right) - 2 \cdot \frac{{x}^{2}}{{1}^{2}}\right)}\]
  3. Simplified0.7

    \[\leadsto \frac{1}{2} \cdot \color{blue}{\mathsf{fma}\left(\mathsf{fma}\left(x, x, x\right), 2, \log 1 - 2 \cdot \frac{{x}^{2}}{{1}^{2}}\right)}\]
  4. Final simplification0.7

    \[\leadsto \frac{1}{2} \cdot \mathsf{fma}\left(\mathsf{fma}\left(x, x, x\right), 2, \log 1 - 2 \cdot \frac{{x}^{2}}{{1}^{2}}\right)\]

Reproduce

herbie shell --seed 2020056 +o rules:numerics
(FPCore (x)
  :name "Hyperbolic arc-(co)tangent"
  :precision binary64
  (* (/ 1 2) (log (/ (+ 1 x) (- 1 x)))))