\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 2.49445624012960862396084940365110205816 \cdot 10^{-289}:\\
\;\;\;\;\frac{\frac{\sqrt{\mathsf{fma}\left(\left(-a\right) \cdot 4, c, b \cdot b\right)} - b}{a}}{2}\\
\mathbf{elif}\;b \le 3.224491050532555179035846228386712352959 \cdot 10^{112}:\\
\;\;\;\;\frac{\frac{\frac{-1}{\sqrt[3]{b + \sqrt{\mathsf{fma}\left(4, c \cdot \left(-a\right), b \cdot b\right)}}}}{\sqrt[3]{b + \sqrt{\mathsf{fma}\left(4, c \cdot \left(-a\right), b \cdot b\right)}}} \cdot \left(\frac{a}{a} \cdot \frac{c \cdot 4}{\sqrt[3]{b + \sqrt{\mathsf{fma}\left(4, c \cdot \left(-a\right), b \cdot b\right)}}}\right)}{2}\\
\mathbf{else}:\\
\;\;\;\;\frac{\frac{\frac{\mathsf{fma}\left(c \cdot \left(-a\right), 4, 0\right)}{2 \cdot b}}{a}}{2}\\
\end{array}double f(double a, double b, double c) {
double r65939 = b;
double r65940 = -r65939;
double r65941 = r65939 * r65939;
double r65942 = 4.0;
double r65943 = a;
double r65944 = r65942 * r65943;
double r65945 = c;
double r65946 = r65944 * r65945;
double r65947 = r65941 - r65946;
double r65948 = sqrt(r65947);
double r65949 = r65940 + r65948;
double r65950 = 2.0;
double r65951 = r65950 * r65943;
double r65952 = r65949 / r65951;
return r65952;
}
double f(double a, double b, double c) {
double r65953 = b;
double r65954 = 2.4944562401296086e-289;
bool r65955 = r65953 <= r65954;
double r65956 = a;
double r65957 = -r65956;
double r65958 = 4.0;
double r65959 = r65957 * r65958;
double r65960 = c;
double r65961 = r65953 * r65953;
double r65962 = fma(r65959, r65960, r65961);
double r65963 = sqrt(r65962);
double r65964 = r65963 - r65953;
double r65965 = r65964 / r65956;
double r65966 = 2.0;
double r65967 = r65965 / r65966;
double r65968 = 3.224491050532555e+112;
bool r65969 = r65953 <= r65968;
double r65970 = -1.0;
double r65971 = r65960 * r65957;
double r65972 = fma(r65958, r65971, r65961);
double r65973 = sqrt(r65972);
double r65974 = r65953 + r65973;
double r65975 = cbrt(r65974);
double r65976 = r65970 / r65975;
double r65977 = r65976 / r65975;
double r65978 = r65956 / r65956;
double r65979 = r65960 * r65958;
double r65980 = r65979 / r65975;
double r65981 = r65978 * r65980;
double r65982 = r65977 * r65981;
double r65983 = r65982 / r65966;
double r65984 = 0.0;
double r65985 = fma(r65971, r65958, r65984);
double r65986 = 2.0;
double r65987 = r65986 * r65953;
double r65988 = r65985 / r65987;
double r65989 = r65988 / r65956;
double r65990 = r65989 / r65966;
double r65991 = r65969 ? r65983 : r65990;
double r65992 = r65955 ? r65967 : r65991;
return r65992;
}




Bits error versus a




Bits error versus b




Bits error versus c
| Original | 34.6 |
|---|---|
| Target | 21.0 |
| Herbie | 16.2 |
if b < 2.4944562401296086e-289Initial program 22.5
Simplified22.5
rmApplied *-un-lft-identity22.5
Applied associate-/r*22.5
Simplified22.5
if 2.4944562401296086e-289 < b < 3.224491050532555e+112Initial program 33.8
Simplified33.8
rmApplied flip--33.8
Simplified15.8
Simplified15.8
rmApplied *-un-lft-identity15.8
Applied add-cube-cbrt16.5
Applied *-un-lft-identity16.5
Applied times-frac16.5
Applied times-frac15.8
Simplified15.8
Simplified9.1
if 3.224491050532555e+112 < b Initial program 60.8
Simplified60.8
rmApplied flip--60.8
Simplified32.5
Simplified32.5
Taylor expanded around 0 13.1
Final simplification16.2
herbie shell --seed 2019194 +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)))