Average Error: 0.1 → 0.1
Time: 21.7s
Precision: 64
\[\left(\left(x - \left(y + 0.5\right) \cdot \log y\right) + y\right) - z\]
\[\left(\left(\mathsf{fma}\left(-\log y, 0.5 + y, \log y \cdot \left(0.5 + y\right)\right) + y\right) + \mathsf{fma}\left(1, x, -\left(\log y \cdot 0.5 + y \cdot \log y\right)\right)\right) - z\]
\left(\left(x - \left(y + 0.5\right) \cdot \log y\right) + y\right) - z
\left(\left(\mathsf{fma}\left(-\log y, 0.5 + y, \log y \cdot \left(0.5 + y\right)\right) + y\right) + \mathsf{fma}\left(1, x, -\left(\log y \cdot 0.5 + y \cdot \log y\right)\right)\right) - z
double f(double x, double y, double z) {
        double r15552743 = x;
        double r15552744 = y;
        double r15552745 = 0.5;
        double r15552746 = r15552744 + r15552745;
        double r15552747 = log(r15552744);
        double r15552748 = r15552746 * r15552747;
        double r15552749 = r15552743 - r15552748;
        double r15552750 = r15552749 + r15552744;
        double r15552751 = z;
        double r15552752 = r15552750 - r15552751;
        return r15552752;
}

double f(double x, double y, double z) {
        double r15552753 = y;
        double r15552754 = log(r15552753);
        double r15552755 = -r15552754;
        double r15552756 = 0.5;
        double r15552757 = r15552756 + r15552753;
        double r15552758 = r15552754 * r15552757;
        double r15552759 = fma(r15552755, r15552757, r15552758);
        double r15552760 = r15552759 + r15552753;
        double r15552761 = 1.0;
        double r15552762 = x;
        double r15552763 = r15552754 * r15552756;
        double r15552764 = r15552753 * r15552754;
        double r15552765 = r15552763 + r15552764;
        double r15552766 = -r15552765;
        double r15552767 = fma(r15552761, r15552762, r15552766);
        double r15552768 = r15552760 + r15552767;
        double r15552769 = z;
        double r15552770 = r15552768 - r15552769;
        return r15552770;
}

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. Using strategy rm
  7. Applied distribute-rgt-in0.1

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

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

Reproduce

herbie shell --seed 2019162 +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))