Average Error: 9.2 → 0.1
Time: 1.2m
Precision: 64
\[\frac{x}{y} + \frac{2 + \left(z \cdot 2\right) \cdot \left(1 - t\right)}{t \cdot z}\]
\[\mathsf{fma}\left(\frac{2}{t}, \left(\frac{1}{z} + 1\right) - t, \frac{x}{y}\right)\]
\frac{x}{y} + \frac{2 + \left(z \cdot 2\right) \cdot \left(1 - t\right)}{t \cdot z}
\mathsf{fma}\left(\frac{2}{t}, \left(\frac{1}{z} + 1\right) - t, \frac{x}{y}\right)
double f(double x, double y, double z, double t) {
        double r19444042 = x;
        double r19444043 = y;
        double r19444044 = r19444042 / r19444043;
        double r19444045 = 2.0;
        double r19444046 = z;
        double r19444047 = r19444046 * r19444045;
        double r19444048 = 1.0;
        double r19444049 = t;
        double r19444050 = r19444048 - r19444049;
        double r19444051 = r19444047 * r19444050;
        double r19444052 = r19444045 + r19444051;
        double r19444053 = r19444049 * r19444046;
        double r19444054 = r19444052 / r19444053;
        double r19444055 = r19444044 + r19444054;
        return r19444055;
}

double f(double x, double y, double z, double t) {
        double r19444056 = 2.0;
        double r19444057 = t;
        double r19444058 = r19444056 / r19444057;
        double r19444059 = 1.0;
        double r19444060 = z;
        double r19444061 = r19444059 / r19444060;
        double r19444062 = 1.0;
        double r19444063 = r19444061 + r19444062;
        double r19444064 = r19444063 - r19444057;
        double r19444065 = x;
        double r19444066 = y;
        double r19444067 = r19444065 / r19444066;
        double r19444068 = fma(r19444058, r19444064, r19444067);
        return r19444068;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Target

Original9.2
Target0.1
Herbie0.1
\[\frac{\frac{2}{z} + 2}{t} - \left(2 - \frac{x}{y}\right)\]

Derivation

  1. Initial program 9.2

    \[\frac{x}{y} + \frac{2 + \left(z \cdot 2\right) \cdot \left(1 - t\right)}{t \cdot z}\]
  2. Simplified9.2

    \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{2}{t}, \frac{\mathsf{fma}\left(1 - t, z, 1\right)}{z}, \frac{x}{y}\right)}\]
  3. Taylor expanded around 0 0.1

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

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

Reproduce

herbie shell --seed 2019200 +o rules:numerics
(FPCore (x y z t)
  :name "Data.HashTable.ST.Basic:computeOverhead from hashtables-1.2.0.2"

  :herbie-target
  (- (/ (+ (/ 2.0 z) 2.0) t) (- 2.0 (/ x y)))

  (+ (/ x y) (/ (+ 2.0 (* (* z 2.0) (- 1.0 t))) (* t z))))