\frac{x \cdot x}{y \cdot y} + \frac{z \cdot z}{t \cdot t}\mathsf{hypot}\left(\frac{x}{y}, \frac{z}{t}\right) \cdot \left(\left(\sqrt{\sqrt{\mathsf{hypot}\left(\frac{x}{y}, \frac{z}{t}\right)}} \cdot \sqrt{\sqrt{\mathsf{hypot}\left(\frac{x}{y}, \frac{z}{t}\right)}}\right) \cdot \sqrt{\mathsf{hypot}\left(\frac{x}{y}, \frac{z}{t}\right)}\right)double f(double x, double y, double z, double t) {
double r745316 = x;
double r745317 = r745316 * r745316;
double r745318 = y;
double r745319 = r745318 * r745318;
double r745320 = r745317 / r745319;
double r745321 = z;
double r745322 = r745321 * r745321;
double r745323 = t;
double r745324 = r745323 * r745323;
double r745325 = r745322 / r745324;
double r745326 = r745320 + r745325;
return r745326;
}
double f(double x, double y, double z, double t) {
double r745327 = x;
double r745328 = y;
double r745329 = r745327 / r745328;
double r745330 = z;
double r745331 = t;
double r745332 = r745330 / r745331;
double r745333 = hypot(r745329, r745332);
double r745334 = sqrt(r745333);
double r745335 = sqrt(r745334);
double r745336 = r745335 * r745335;
double r745337 = r745336 * r745334;
double r745338 = r745333 * r745337;
return r745338;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
Results
| Original | 33.2 |
|---|---|
| Target | 0.4 |
| Herbie | 0.7 |
Initial program 33.2
Simplified19.0
rmApplied add-sqr-sqrt19.1
Simplified19.0
Simplified0.4
rmApplied add-sqr-sqrt0.6
rmApplied add-sqr-sqrt0.6
Applied sqrt-prod0.7
Final simplification0.7
herbie shell --seed 2019351 +o rules:numerics
(FPCore (x y z t)
:name "Graphics.Rasterific.Svg.PathConverter:arcToSegments from rasterific-svg-0.2.3.1"
:precision binary64
:herbie-target
(+ (pow (/ x y) 2) (pow (/ z t) 2))
(+ (/ (* x x) (* y y)) (/ (* z z) (* t t))))