Average Error: 58.5 → 0.7
Time: 6.9s
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 r80195 = 1.0;
        double r80196 = 2.0;
        double r80197 = r80195 / r80196;
        double r80198 = x;
        double r80199 = r80195 + r80198;
        double r80200 = r80195 - r80198;
        double r80201 = r80199 / r80200;
        double r80202 = log(r80201);
        double r80203 = r80197 * r80202;
        return r80203;
}

double f(double x) {
        double r80204 = 1.0;
        double r80205 = 2.0;
        double r80206 = r80204 / r80205;
        double r80207 = x;
        double r80208 = fma(r80207, r80207, r80207);
        double r80209 = log(r80204);
        double r80210 = 2.0;
        double r80211 = pow(r80207, r80210);
        double r80212 = pow(r80204, r80210);
        double r80213 = r80211 / r80212;
        double r80214 = r80205 * r80213;
        double r80215 = r80209 - r80214;
        double r80216 = fma(r80208, r80205, r80215);
        double r80217 = r80206 * r80216;
        return r80217;
}

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)))))