Average Error: 2.0 → 0.2
Time: 21.7s
Precision: 64
\[x - \frac{y - z}{\frac{\left(t - z\right) + 1.0}{a}}\]
\[\mathsf{fma}\left(\frac{z - y}{\left(1.0 + t\right) - z}, a, x\right)\]
x - \frac{y - z}{\frac{\left(t - z\right) + 1.0}{a}}
\mathsf{fma}\left(\frac{z - y}{\left(1.0 + t\right) - z}, a, x\right)
double f(double x, double y, double z, double t, double a) {
        double r26414008 = x;
        double r26414009 = y;
        double r26414010 = z;
        double r26414011 = r26414009 - r26414010;
        double r26414012 = t;
        double r26414013 = r26414012 - r26414010;
        double r26414014 = 1.0;
        double r26414015 = r26414013 + r26414014;
        double r26414016 = a;
        double r26414017 = r26414015 / r26414016;
        double r26414018 = r26414011 / r26414017;
        double r26414019 = r26414008 - r26414018;
        return r26414019;
}

double f(double x, double y, double z, double t, double a) {
        double r26414020 = z;
        double r26414021 = y;
        double r26414022 = r26414020 - r26414021;
        double r26414023 = 1.0;
        double r26414024 = t;
        double r26414025 = r26414023 + r26414024;
        double r26414026 = r26414025 - r26414020;
        double r26414027 = r26414022 / r26414026;
        double r26414028 = a;
        double r26414029 = x;
        double r26414030 = fma(r26414027, r26414028, r26414029);
        return r26414030;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Bits error versus a

Target

Original2.0
Target0.2
Herbie0.2
\[x - \frac{y - z}{\left(t - z\right) + 1.0} \cdot a\]

Derivation

  1. Initial program 2.0

    \[x - \frac{y - z}{\frac{\left(t - z\right) + 1.0}{a}}\]
  2. Simplified0.2

    \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{z - y}{\left(1.0 + t\right) - z}, a, x\right)}\]
  3. Final simplification0.2

    \[\leadsto \mathsf{fma}\left(\frac{z - y}{\left(1.0 + t\right) - z}, a, x\right)\]

Reproduce

herbie shell --seed 2019163 +o rules:numerics
(FPCore (x y z t a)
  :name "Graphics.Rendering.Chart.SparkLine:renderSparkLine from Chart-1.5.3"

  :herbie-target
  (- x (* (/ (- y z) (+ (- t z) 1.0)) a))

  (- x (/ (- y z) (/ (+ (- t z) 1.0) a))))