Average Error: 58.5 → 0.6
Time: 6.2s
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 r76907 = 1.0;
        double r76908 = 2.0;
        double r76909 = r76907 / r76908;
        double r76910 = x;
        double r76911 = r76907 + r76910;
        double r76912 = r76907 - r76910;
        double r76913 = r76911 / r76912;
        double r76914 = log(r76913);
        double r76915 = r76909 * r76914;
        return r76915;
}

double f(double x) {
        double r76916 = 1.0;
        double r76917 = 2.0;
        double r76918 = r76916 / r76917;
        double r76919 = x;
        double r76920 = fma(r76919, r76919, r76919);
        double r76921 = log(r76916);
        double r76922 = 2.0;
        double r76923 = pow(r76919, r76922);
        double r76924 = pow(r76916, r76922);
        double r76925 = r76923 / r76924;
        double r76926 = r76917 * r76925;
        double r76927 = r76921 - r76926;
        double r76928 = fma(r76920, r76917, r76927);
        double r76929 = r76918 * r76928;
        return r76929;
}

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