Average Error: 0.1 → 0.1
Time: 2.1m
Precision: 64
\[\left(\left(x - \left(y + 0.5\right) \cdot \log y\right) + y\right) - z\]
\[x - \mathsf{fma}\left(\log y, y + 0.5, z - y\right)\]
\left(\left(x - \left(y + 0.5\right) \cdot \log y\right) + y\right) - z
x - \mathsf{fma}\left(\log y, y + 0.5, z - y\right)
double f(double x, double y, double z) {
        double r22427350 = x;
        double r22427351 = y;
        double r22427352 = 0.5;
        double r22427353 = r22427351 + r22427352;
        double r22427354 = log(r22427351);
        double r22427355 = r22427353 * r22427354;
        double r22427356 = r22427350 - r22427355;
        double r22427357 = r22427356 + r22427351;
        double r22427358 = z;
        double r22427359 = r22427357 - r22427358;
        return r22427359;
}

double f(double x, double y, double z) {
        double r22427360 = x;
        double r22427361 = y;
        double r22427362 = log(r22427361);
        double r22427363 = 0.5;
        double r22427364 = r22427361 + r22427363;
        double r22427365 = z;
        double r22427366 = r22427365 - r22427361;
        double r22427367 = fma(r22427362, r22427364, r22427366);
        double r22427368 = r22427360 - r22427367;
        return r22427368;
}

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. Simplified0.1

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

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

Reproduce

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

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

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