Average Error: 58.6 → 0.7
Time: 7.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 r94151 = 1.0;
        double r94152 = 2.0;
        double r94153 = r94151 / r94152;
        double r94154 = x;
        double r94155 = r94151 + r94154;
        double r94156 = r94151 - r94154;
        double r94157 = r94155 / r94156;
        double r94158 = log(r94157);
        double r94159 = r94153 * r94158;
        return r94159;
}

double f(double x) {
        double r94160 = 1.0;
        double r94161 = 2.0;
        double r94162 = r94160 / r94161;
        double r94163 = x;
        double r94164 = fma(r94163, r94163, r94163);
        double r94165 = log(r94160);
        double r94166 = 2.0;
        double r94167 = pow(r94163, r94166);
        double r94168 = pow(r94160, r94166);
        double r94169 = r94167 / r94168;
        double r94170 = r94161 * r94169;
        double r94171 = r94165 - r94170;
        double r94172 = fma(r94164, r94161, r94171);
        double r94173 = r94162 * r94172;
        return r94173;
}

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