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 r36566298 = x;
        double r36566299 = y;
        double r36566300 = r36566298 / r36566299;
        double r36566301 = 2.0;
        double r36566302 = z;
        double r36566303 = r36566302 * r36566301;
        double r36566304 = 1.0;
        double r36566305 = t;
        double r36566306 = r36566304 - r36566305;
        double r36566307 = r36566303 * r36566306;
        double r36566308 = r36566301 + r36566307;
        double r36566309 = r36566305 * r36566302;
        double r36566310 = r36566308 / r36566309;
        double r36566311 = r36566300 + r36566310;
        return r36566311;
}

double f(double x, double y, double z, double t) {
        double r36566312 = 2.0;
        double r36566313 = t;
        double r36566314 = r36566312 / r36566313;
        double r36566315 = 1.0;
        double r36566316 = z;
        double r36566317 = r36566315 / r36566316;
        double r36566318 = 1.0;
        double r36566319 = r36566317 + r36566318;
        double r36566320 = r36566319 - r36566313;
        double r36566321 = x;
        double r36566322 = y;
        double r36566323 = r36566321 / r36566322;
        double r36566324 = fma(r36566314, r36566320, r36566323);
        return r36566324;
}

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))))