2 \cdot \sqrt{\left(x \cdot y + x \cdot z\right) + y \cdot z}\sqrt{\mathsf{fma}\left(x, z, y \cdot \left(z + x\right)\right)} \cdot 2double f(double x, double y, double z) {
double r399276 = 2.0;
double r399277 = x;
double r399278 = y;
double r399279 = r399277 * r399278;
double r399280 = z;
double r399281 = r399277 * r399280;
double r399282 = r399279 + r399281;
double r399283 = r399278 * r399280;
double r399284 = r399282 + r399283;
double r399285 = sqrt(r399284);
double r399286 = r399276 * r399285;
return r399286;
}
double f(double x, double y, double z) {
double r399287 = x;
double r399288 = z;
double r399289 = y;
double r399290 = r399288 + r399287;
double r399291 = r399289 * r399290;
double r399292 = fma(r399287, r399288, r399291);
double r399293 = sqrt(r399292);
double r399294 = 2.0;
double r399295 = r399293 * r399294;
return r399295;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 20.2 |
|---|---|
| Target | 19.4 |
| Herbie | 20.2 |
Initial program 20.2
Simplified20.2
Taylor expanded around 0 20.2
Simplified20.2
Final simplification20.2
herbie shell --seed 2019304 +o rules:numerics
(FPCore (x y z)
:name "Diagrams.TwoD.Apollonian:descartes from diagrams-contrib-1.3.0.5"
:precision binary64
:herbie-target
(if (< z 7.6369500905736745e176) (* 2 (sqrt (+ (* (+ x y) z) (* x y)))) (* (* (+ (* 0.25 (* (* (pow y -0.75) (* (pow z -0.75) x)) (+ y z))) (* (pow z 0.25) (pow y 0.25))) (+ (* 0.25 (* (* (pow y -0.75) (* (pow z -0.75) x)) (+ y z))) (* (pow z 0.25) (pow y 0.25)))) 2))
(* 2 (sqrt (+ (+ (* x y) (* x z)) (* y z)))))