Average Error: 10.4 → 0.9
Time: 3.4s
Precision: 64
\[\frac{x \cdot \left(\left(y - z\right) + 1\right)}{z}\]
\[\mathsf{fma}\left(1, \frac{x}{z}, \left(x \cdot \frac{\sqrt[3]{y} \cdot \sqrt[3]{y}}{\sqrt[3]{z} \cdot \sqrt[3]{z}}\right) \cdot \frac{\sqrt[3]{y}}{\sqrt[3]{z}}\right) - x\]
\frac{x \cdot \left(\left(y - z\right) + 1\right)}{z}
\mathsf{fma}\left(1, \frac{x}{z}, \left(x \cdot \frac{\sqrt[3]{y} \cdot \sqrt[3]{y}}{\sqrt[3]{z} \cdot \sqrt[3]{z}}\right) \cdot \frac{\sqrt[3]{y}}{\sqrt[3]{z}}\right) - x
double f(double x, double y, double z) {
        double r617377 = x;
        double r617378 = y;
        double r617379 = z;
        double r617380 = r617378 - r617379;
        double r617381 = 1.0;
        double r617382 = r617380 + r617381;
        double r617383 = r617377 * r617382;
        double r617384 = r617383 / r617379;
        return r617384;
}

double f(double x, double y, double z) {
        double r617385 = 1.0;
        double r617386 = x;
        double r617387 = z;
        double r617388 = r617386 / r617387;
        double r617389 = y;
        double r617390 = cbrt(r617389);
        double r617391 = r617390 * r617390;
        double r617392 = cbrt(r617387);
        double r617393 = r617392 * r617392;
        double r617394 = r617391 / r617393;
        double r617395 = r617386 * r617394;
        double r617396 = r617390 / r617392;
        double r617397 = r617395 * r617396;
        double r617398 = fma(r617385, r617388, r617397);
        double r617399 = r617398 - r617386;
        return r617399;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original10.4
Target0.4
Herbie0.9
\[\begin{array}{l} \mathbf{if}\;x \lt -2.7148310671343599 \cdot 10^{-162}:\\ \;\;\;\;\left(1 + y\right) \cdot \frac{x}{z} - x\\ \mathbf{elif}\;x \lt 3.87410881643954616 \cdot 10^{-197}:\\ \;\;\;\;\left(x \cdot \left(\left(y - z\right) + 1\right)\right) \cdot \frac{1}{z}\\ \mathbf{else}:\\ \;\;\;\;\left(1 + y\right) \cdot \frac{x}{z} - x\\ \end{array}\]

Derivation

  1. Initial program 10.4

    \[\frac{x \cdot \left(\left(y - z\right) + 1\right)}{z}\]
  2. Taylor expanded around 0 3.6

    \[\leadsto \color{blue}{\left(\frac{x \cdot y}{z} + 1 \cdot \frac{x}{z}\right) - x}\]
  3. Simplified3.6

    \[\leadsto \color{blue}{\mathsf{fma}\left(1, \frac{x}{z}, \frac{x \cdot y}{z}\right) - x}\]
  4. Using strategy rm
  5. Applied *-un-lft-identity3.6

    \[\leadsto \mathsf{fma}\left(1, \frac{x}{z}, \frac{x \cdot y}{\color{blue}{1 \cdot z}}\right) - x\]
  6. Applied times-frac3.3

    \[\leadsto \mathsf{fma}\left(1, \frac{x}{z}, \color{blue}{\frac{x}{1} \cdot \frac{y}{z}}\right) - x\]
  7. Simplified3.3

    \[\leadsto \mathsf{fma}\left(1, \frac{x}{z}, \color{blue}{x} \cdot \frac{y}{z}\right) - x\]
  8. Using strategy rm
  9. Applied add-cube-cbrt3.6

    \[\leadsto \mathsf{fma}\left(1, \frac{x}{z}, x \cdot \frac{y}{\color{blue}{\left(\sqrt[3]{z} \cdot \sqrt[3]{z}\right) \cdot \sqrt[3]{z}}}\right) - x\]
  10. Applied add-cube-cbrt3.7

    \[\leadsto \mathsf{fma}\left(1, \frac{x}{z}, x \cdot \frac{\color{blue}{\left(\sqrt[3]{y} \cdot \sqrt[3]{y}\right) \cdot \sqrt[3]{y}}}{\left(\sqrt[3]{z} \cdot \sqrt[3]{z}\right) \cdot \sqrt[3]{z}}\right) - x\]
  11. Applied times-frac3.7

    \[\leadsto \mathsf{fma}\left(1, \frac{x}{z}, x \cdot \color{blue}{\left(\frac{\sqrt[3]{y} \cdot \sqrt[3]{y}}{\sqrt[3]{z} \cdot \sqrt[3]{z}} \cdot \frac{\sqrt[3]{y}}{\sqrt[3]{z}}\right)}\right) - x\]
  12. Applied associate-*r*0.9

    \[\leadsto \mathsf{fma}\left(1, \frac{x}{z}, \color{blue}{\left(x \cdot \frac{\sqrt[3]{y} \cdot \sqrt[3]{y}}{\sqrt[3]{z} \cdot \sqrt[3]{z}}\right) \cdot \frac{\sqrt[3]{y}}{\sqrt[3]{z}}}\right) - x\]
  13. Final simplification0.9

    \[\leadsto \mathsf{fma}\left(1, \frac{x}{z}, \left(x \cdot \frac{\sqrt[3]{y} \cdot \sqrt[3]{y}}{\sqrt[3]{z} \cdot \sqrt[3]{z}}\right) \cdot \frac{\sqrt[3]{y}}{\sqrt[3]{z}}\right) - x\]

Reproduce

herbie shell --seed 2020081 +o rules:numerics
(FPCore (x y z)
  :name "Diagrams.TwoD.Segment.Bernstein:evaluateBernstein from diagrams-lib-1.3.0.3"
  :precision binary64

  :herbie-target
  (if (< x -2.71483106713436e-162) (- (* (+ 1 y) (/ x z)) x) (if (< x 3.874108816439546e-197) (* (* x (+ (- y z) 1)) (/ 1 z)) (- (* (+ 1 y) (/ x z)) x)))

  (/ (* x (+ (- y z) 1)) z))