\frac{\left(-b\right) + \sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c}}{2 \cdot a}\begin{array}{l}
\mathbf{if}\;b \le -1.802032183745334768196101346563616909151 \cdot 10^{-307}:\\
\;\;\;\;\frac{\frac{1}{\frac{a}{\sqrt{\mathsf{fma}\left(\left(-a\right) \cdot 4, c, b \cdot b\right)} - b}}}{2}\\
\mathbf{elif}\;b \le 4.033968672442674816629306589314441243721 \cdot 10^{160}:\\
\;\;\;\;\frac{\left(\frac{a}{a} \cdot \frac{4 \cdot c}{\sqrt{b + \sqrt{\mathsf{fma}\left(4, c \cdot \left(-a\right), b \cdot b\right)}}}\right) \cdot \frac{-1}{\sqrt{\sqrt{\sqrt[3]{\mathsf{fma}\left(a, -4 \cdot c, b \cdot b\right)}} \cdot \left|\sqrt[3]{\mathsf{fma}\left(a, -4 \cdot c, b \cdot b\right)}\right| + b}}}{2}\\
\mathbf{else}:\\
\;\;\;\;\frac{\frac{\frac{\mathsf{fma}\left(c \cdot \left(-a\right), 4, 0\right)}{b + b}}{a}}{2}\\
\end{array}double f(double a, double b, double c) {
double r129294 = b;
double r129295 = -r129294;
double r129296 = r129294 * r129294;
double r129297 = 4.0;
double r129298 = a;
double r129299 = r129297 * r129298;
double r129300 = c;
double r129301 = r129299 * r129300;
double r129302 = r129296 - r129301;
double r129303 = sqrt(r129302);
double r129304 = r129295 + r129303;
double r129305 = 2.0;
double r129306 = r129305 * r129298;
double r129307 = r129304 / r129306;
return r129307;
}
double f(double a, double b, double c) {
double r129308 = b;
double r129309 = -1.8020321837453348e-307;
bool r129310 = r129308 <= r129309;
double r129311 = 1.0;
double r129312 = a;
double r129313 = -r129312;
double r129314 = 4.0;
double r129315 = r129313 * r129314;
double r129316 = c;
double r129317 = r129308 * r129308;
double r129318 = fma(r129315, r129316, r129317);
double r129319 = sqrt(r129318);
double r129320 = r129319 - r129308;
double r129321 = r129312 / r129320;
double r129322 = r129311 / r129321;
double r129323 = 2.0;
double r129324 = r129322 / r129323;
double r129325 = 4.033968672442675e+160;
bool r129326 = r129308 <= r129325;
double r129327 = r129312 / r129312;
double r129328 = r129314 * r129316;
double r129329 = r129316 * r129313;
double r129330 = fma(r129314, r129329, r129317);
double r129331 = sqrt(r129330);
double r129332 = r129308 + r129331;
double r129333 = sqrt(r129332);
double r129334 = r129328 / r129333;
double r129335 = r129327 * r129334;
double r129336 = -1.0;
double r129337 = -r129328;
double r129338 = fma(r129312, r129337, r129317);
double r129339 = cbrt(r129338);
double r129340 = sqrt(r129339);
double r129341 = fabs(r129339);
double r129342 = r129340 * r129341;
double r129343 = r129342 + r129308;
double r129344 = sqrt(r129343);
double r129345 = r129336 / r129344;
double r129346 = r129335 * r129345;
double r129347 = r129346 / r129323;
double r129348 = 0.0;
double r129349 = fma(r129329, r129314, r129348);
double r129350 = r129308 + r129308;
double r129351 = r129349 / r129350;
double r129352 = r129351 / r129312;
double r129353 = r129352 / r129323;
double r129354 = r129326 ? r129347 : r129353;
double r129355 = r129310 ? r129324 : r129354;
return r129355;
}




Bits error versus a




Bits error versus b




Bits error versus c
| Original | 33.8 |
|---|---|
| Target | 20.6 |
| Herbie | 15.8 |
if b < -1.8020321837453348e-307Initial program 21.4
Simplified21.5
rmApplied clear-num21.6
Simplified21.5
if -1.8020321837453348e-307 < b < 4.033968672442675e+160Initial program 35.3
Simplified35.3
rmApplied flip--35.4
Simplified16.5
Simplified16.5
rmApplied *-un-lft-identity16.5
Applied add-sqr-sqrt16.7
Applied *-un-lft-identity16.7
Applied times-frac16.7
Applied times-frac15.9
Simplified15.9
Simplified9.3
rmApplied add-cube-cbrt9.4
Applied sqrt-prod9.4
Simplified9.4
Simplified9.4
if 4.033968672442675e+160 < b Initial program 64.0
Simplified64.0
rmApplied flip--64.0
Simplified38.6
Simplified38.6
Taylor expanded around 0 14.6
Final simplification15.8
herbie shell --seed 2019179 +o rules:numerics
(FPCore (a b c)
:name "The quadratic formula (r1)"
:herbie-target
(if (< b 0.0) (/ (+ (- b) (sqrt (- (* b b) (* (* 4.0 a) c)))) (* 2.0 a)) (/ c (* a (/ (- (- b) (sqrt (- (* b b) (* (* 4.0 a) c)))) (* 2.0 a)))))
(/ (+ (- b) (sqrt (- (* b b) (* (* 4.0 a) c)))) (* 2.0 a)))