\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.690589989251114327382025705232506133811 \cdot 10^{-305}:\\
\;\;\;\;\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 6.695434107567982389585546912636742560821 \cdot 10^{164}:\\
\;\;\;\;\frac{\left(\frac{4 \cdot c}{\sqrt{\mathsf{fma}\left(\sqrt[3]{b} \cdot \sqrt[3]{b}, \sqrt[3]{b}, \sqrt{\mathsf{fma}\left(4, a \cdot \left(-c\right), b \cdot b\right)}\right)}} \cdot \frac{a}{a}\right) \cdot \frac{-1}{\sqrt{\sqrt{\mathsf{fma}\left(4, a \cdot \left(-c\right), b \cdot b\right)} + b}}}{2}\\
\mathbf{else}:\\
\;\;\;\;\frac{\frac{\frac{\mathsf{fma}\left(a \cdot \left(-c\right), 4, 0\right)}{b + b}}{a}}{2}\\
\end{array}double f(double a, double b, double c) {
double r132054 = b;
double r132055 = -r132054;
double r132056 = r132054 * r132054;
double r132057 = 4.0;
double r132058 = a;
double r132059 = r132057 * r132058;
double r132060 = c;
double r132061 = r132059 * r132060;
double r132062 = r132056 - r132061;
double r132063 = sqrt(r132062);
double r132064 = r132055 + r132063;
double r132065 = 2.0;
double r132066 = r132065 * r132058;
double r132067 = r132064 / r132066;
return r132067;
}
double f(double a, double b, double c) {
double r132068 = b;
double r132069 = 1.6905899892511143e-305;
bool r132070 = r132068 <= r132069;
double r132071 = 1.0;
double r132072 = a;
double r132073 = -r132072;
double r132074 = 4.0;
double r132075 = r132073 * r132074;
double r132076 = c;
double r132077 = r132068 * r132068;
double r132078 = fma(r132075, r132076, r132077);
double r132079 = sqrt(r132078);
double r132080 = r132079 - r132068;
double r132081 = r132072 / r132080;
double r132082 = r132071 / r132081;
double r132083 = 2.0;
double r132084 = r132082 / r132083;
double r132085 = 6.695434107567982e+164;
bool r132086 = r132068 <= r132085;
double r132087 = r132074 * r132076;
double r132088 = cbrt(r132068);
double r132089 = r132088 * r132088;
double r132090 = -r132076;
double r132091 = r132072 * r132090;
double r132092 = fma(r132074, r132091, r132077);
double r132093 = sqrt(r132092);
double r132094 = fma(r132089, r132088, r132093);
double r132095 = sqrt(r132094);
double r132096 = r132087 / r132095;
double r132097 = r132072 / r132072;
double r132098 = r132096 * r132097;
double r132099 = -1.0;
double r132100 = r132093 + r132068;
double r132101 = sqrt(r132100);
double r132102 = r132099 / r132101;
double r132103 = r132098 * r132102;
double r132104 = r132103 / r132083;
double r132105 = 0.0;
double r132106 = fma(r132091, r132074, r132105);
double r132107 = r132068 + r132068;
double r132108 = r132106 / r132107;
double r132109 = r132108 / r132072;
double r132110 = r132109 / r132083;
double r132111 = r132086 ? r132104 : r132110;
double r132112 = r132070 ? r132084 : r132111;
return r132112;
}




Bits error versus a




Bits error versus b




Bits error versus c
| Original | 33.8 |
|---|---|
| Target | 21.2 |
| Herbie | 16.3 |
if b < 1.6905899892511143e-305Initial program 22.0
Simplified22.0
rmApplied clear-num22.1
Simplified22.1
if 1.6905899892511143e-305 < b < 6.695434107567982e+164Initial program 35.2
Simplified35.2
rmApplied flip--35.3
Simplified17.3
Simplified17.2
rmApplied *-un-lft-identity17.2
Applied add-sqr-sqrt17.4
Applied *-un-lft-identity17.4
Applied times-frac17.4
Applied times-frac16.6
Simplified16.6
Simplified10.0
rmApplied add-cube-cbrt10.1
Applied fma-def10.1
if 6.695434107567982e+164 < b Initial program 64.0
Simplified64.0
rmApplied flip--64.0
Simplified38.0
Simplified38.0
Taylor expanded around 0 14.4
Final simplification16.3
herbie shell --seed 2019195 +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)))