Average Error: 32.4 → 0
Time: 6.6s
Precision: 64
\[\frac{x}{x} - \frac{1}{x} \cdot \sqrt{x \cdot x}\]
\[\mathsf{fma}\left(1, -\frac{\left|x\right|}{x}, 1\right)\]
\frac{x}{x} - \frac{1}{x} \cdot \sqrt{x \cdot x}
\mathsf{fma}\left(1, -\frac{\left|x\right|}{x}, 1\right)
double f(double x) {
        double r97760 = x;
        double r97761 = r97760 / r97760;
        double r97762 = 1.0;
        double r97763 = r97762 / r97760;
        double r97764 = r97760 * r97760;
        double r97765 = sqrt(r97764);
        double r97766 = r97763 * r97765;
        double r97767 = r97761 - r97766;
        return r97767;
}

double f(double x) {
        double r97768 = 1.0;
        double r97769 = x;
        double r97770 = fabs(r97769);
        double r97771 = r97770 / r97769;
        double r97772 = -r97771;
        double r97773 = 1.0;
        double r97774 = fma(r97768, r97772, r97773);
        return r97774;
}

Error

Bits error versus x

Target

Original32.4
Target0
Herbie0
\[\begin{array}{l} \mathbf{if}\;x \lt 0.0:\\ \;\;\;\;2\\ \mathbf{else}:\\ \;\;\;\;0.0\\ \end{array}\]

Derivation

  1. Initial program 32.4

    \[\frac{x}{x} - \frac{1}{x} \cdot \sqrt{x \cdot x}\]
  2. Simplified4.7

    \[\leadsto \color{blue}{1 - \frac{1}{x} \cdot \left|x\right|}\]
  3. Taylor expanded around 0 0

    \[\leadsto \color{blue}{1 - 1 \cdot \frac{\left|x\right|}{x}}\]
  4. Simplified0

    \[\leadsto \color{blue}{\mathsf{fma}\left(1, -\frac{\left|x\right|}{x}, 1\right)}\]
  5. Final simplification0

    \[\leadsto \mathsf{fma}\left(1, -\frac{\left|x\right|}{x}, 1\right)\]

Reproduce

herbie shell --seed 2019323 +o rules:numerics
(FPCore (x)
  :name "sqrt sqr"
  :precision binary64

  :herbie-target
  (if (< x 0.0) 2 0.0)

  (- (/ x x) (* (/ 1 x) (sqrt (* x x)))))