Average Error: 58.6 → 0.6
Time: 7.1s
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 r93857 = 1.0;
        double r93858 = 2.0;
        double r93859 = r93857 / r93858;
        double r93860 = x;
        double r93861 = r93857 + r93860;
        double r93862 = r93857 - r93860;
        double r93863 = r93861 / r93862;
        double r93864 = log(r93863);
        double r93865 = r93859 * r93864;
        return r93865;
}

double f(double x) {
        double r93866 = 1.0;
        double r93867 = 2.0;
        double r93868 = r93866 / r93867;
        double r93869 = x;
        double r93870 = fma(r93869, r93869, r93869);
        double r93871 = log(r93866);
        double r93872 = 2.0;
        double r93873 = pow(r93869, r93872);
        double r93874 = pow(r93866, r93872);
        double r93875 = r93873 / r93874;
        double r93876 = r93867 * r93875;
        double r93877 = r93871 - r93876;
        double r93878 = fma(r93870, r93867, r93877);
        double r93879 = r93868 * r93878;
        return r93879;
}

Error

Bits error versus x

Derivation

  1. Initial program 58.6

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

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

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

    \[\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 2019353 +o rules:numerics
(FPCore (x)
  :name "Hyperbolic arc-(co)tangent"
  :precision binary64
  (* (/ 1 2) (log (/ (+ 1 x) (- 1 x)))))