Average Error: 0.1 → 0.1
Time: 19.2s
Precision: 64
\[\left(\left(x - \left(y + 0.5\right) \cdot \log y\right) + y\right) - z\]
\[\left(\mathsf{fma}\left(-\log y, 0.5 + y, \mathsf{fma}\left(-\left(y + 0.5\right), \log y, \mathsf{fma}\left(\log y, y + 0.5, y\right)\right)\right) + x\right) - z\]
\left(\left(x - \left(y + 0.5\right) \cdot \log y\right) + y\right) - z
\left(\mathsf{fma}\left(-\log y, 0.5 + y, \mathsf{fma}\left(-\left(y + 0.5\right), \log y, \mathsf{fma}\left(\log y, y + 0.5, y\right)\right)\right) + x\right) - z
double f(double x, double y, double z) {
        double r207432 = x;
        double r207433 = y;
        double r207434 = 0.5;
        double r207435 = r207433 + r207434;
        double r207436 = log(r207433);
        double r207437 = r207435 * r207436;
        double r207438 = r207432 - r207437;
        double r207439 = r207438 + r207433;
        double r207440 = z;
        double r207441 = r207439 - r207440;
        return r207441;
}

double f(double x, double y, double z) {
        double r207442 = y;
        double r207443 = log(r207442);
        double r207444 = -r207443;
        double r207445 = 0.5;
        double r207446 = r207445 + r207442;
        double r207447 = r207442 + r207445;
        double r207448 = -r207447;
        double r207449 = fma(r207443, r207447, r207442);
        double r207450 = fma(r207448, r207443, r207449);
        double r207451 = fma(r207444, r207446, r207450);
        double r207452 = x;
        double r207453 = r207451 + r207452;
        double r207454 = z;
        double r207455 = r207453 - r207454;
        return r207455;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original0.1
Target0.1
Herbie0.1
\[\left(\left(y + x\right) - z\right) - \left(y + 0.5\right) \cdot \log y\]

Derivation

  1. Initial program 0.1

    \[\left(\left(x - \left(y + 0.5\right) \cdot \log y\right) + y\right) - z\]
  2. Using strategy rm
  3. Applied *-un-lft-identity0.1

    \[\leadsto \left(\left(\color{blue}{1 \cdot x} - \left(y + 0.5\right) \cdot \log y\right) + y\right) - z\]
  4. Applied prod-diff0.1

    \[\leadsto \left(\color{blue}{\left(\mathsf{fma}\left(1, x, -\log y \cdot \left(y + 0.5\right)\right) + \mathsf{fma}\left(-\log y, y + 0.5, \log y \cdot \left(y + 0.5\right)\right)\right)} + y\right) - z\]
  5. Applied associate-+l+0.1

    \[\leadsto \color{blue}{\left(\mathsf{fma}\left(1, x, -\log y \cdot \left(y + 0.5\right)\right) + \left(\mathsf{fma}\left(-\log y, y + 0.5, \log y \cdot \left(y + 0.5\right)\right) + y\right)\right)} - z\]
  6. Simplified0.2

    \[\leadsto \left(\mathsf{fma}\left(1, x, -\log y \cdot \left(y + 0.5\right)\right) + \color{blue}{\mathsf{fma}\left(-\left(y + 0.5\right), \log y, \mathsf{fma}\left(\log y, y + 0.5, y\right)\right)}\right) - z\]
  7. Using strategy rm
  8. Applied fma-udef0.2

    \[\leadsto \left(\color{blue}{\left(1 \cdot x + \left(-\log y \cdot \left(y + 0.5\right)\right)\right)} + \mathsf{fma}\left(-\left(y + 0.5\right), \log y, \mathsf{fma}\left(\log y, y + 0.5, y\right)\right)\right) - z\]
  9. Applied associate-+l+0.2

    \[\leadsto \color{blue}{\left(1 \cdot x + \left(\left(-\log y \cdot \left(y + 0.5\right)\right) + \mathsf{fma}\left(-\left(y + 0.5\right), \log y, \mathsf{fma}\left(\log y, y + 0.5, y\right)\right)\right)\right)} - z\]
  10. Simplified0.1

    \[\leadsto \left(1 \cdot x + \color{blue}{\mathsf{fma}\left(-\log y, 0.5 + y, \mathsf{fma}\left(-\left(y + 0.5\right), \log y, \mathsf{fma}\left(\log y, y + 0.5, y\right)\right)\right)}\right) - z\]
  11. Final simplification0.1

    \[\leadsto \left(\mathsf{fma}\left(-\log y, 0.5 + y, \mathsf{fma}\left(-\left(y + 0.5\right), \log y, \mathsf{fma}\left(\log y, y + 0.5, y\right)\right)\right) + x\right) - z\]

Reproduce

herbie shell --seed 2019305 +o rules:numerics
(FPCore (x y z)
  :name "Numeric.SpecFunctions:stirlingError from math-functions-0.1.5.2"
  :precision binary64

  :herbie-target
  (- (- (+ y x) z) (* (+ y 0.5) (log y)))

  (- (+ (- x (* (+ y 0.5) (log y))) y) z))