\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 3.054798768406738353528696346741077845707 \cdot 10^{-17}:\\
\;\;\;\;\frac{\frac{b \cdot b - \mathsf{fma}\left(b, b, 4 \cdot \left(a \cdot c\right)\right)}{\sqrt{b \cdot b - \left(4 \cdot a\right) \cdot c} + b}}{2 \cdot a}\\
\mathbf{else}:\\
\;\;\;\;-1 \cdot \frac{c}{b}\\
\end{array}double f(double a, double b, double c) {
double r15526 = b;
double r15527 = -r15526;
double r15528 = r15526 * r15526;
double r15529 = 4.0;
double r15530 = a;
double r15531 = r15529 * r15530;
double r15532 = c;
double r15533 = r15531 * r15532;
double r15534 = r15528 - r15533;
double r15535 = sqrt(r15534);
double r15536 = r15527 + r15535;
double r15537 = 2.0;
double r15538 = r15537 * r15530;
double r15539 = r15536 / r15538;
return r15539;
}
double f(double a, double b, double c) {
double r15540 = b;
double r15541 = 3.0547987684067384e-17;
bool r15542 = r15540 <= r15541;
double r15543 = r15540 * r15540;
double r15544 = 4.0;
double r15545 = a;
double r15546 = c;
double r15547 = r15545 * r15546;
double r15548 = r15544 * r15547;
double r15549 = fma(r15540, r15540, r15548);
double r15550 = r15543 - r15549;
double r15551 = r15544 * r15545;
double r15552 = r15551 * r15546;
double r15553 = r15543 - r15552;
double r15554 = sqrt(r15553);
double r15555 = r15554 + r15540;
double r15556 = r15550 / r15555;
double r15557 = 2.0;
double r15558 = r15557 * r15545;
double r15559 = r15556 / r15558;
double r15560 = -1.0;
double r15561 = r15546 / r15540;
double r15562 = r15560 * r15561;
double r15563 = r15542 ? r15559 : r15562;
return r15563;
}



Bits error versus a



Bits error versus b



Bits error versus c
if b < 3.0547987684067384e-17Initial program 21.3
Simplified21.3
rmApplied flip--21.3
Simplified20.4
if 3.0547987684067384e-17 < b Initial program 53.0
Simplified53.0
Taylor expanded around inf 5.9
Final simplification6.1
herbie shell --seed 2019306 +o rules:numerics
(FPCore (a b c)
:name "Quadratic roots, wide range"
:precision binary64
:pre (and (< 4.93038e-32 a 2.02824e31) (< 4.93038e-32 b 2.02824e31) (< 4.93038e-32 c 2.02824e31))
(/ (+ (- b) (sqrt (- (* b b) (* (* 4 a) c)))) (* 2 a)))