\frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{3 \cdot a}\frac{\mathsf{fma}\left(\sqrt{\sqrt{{\left(\mathsf{expm1}\left(\mathsf{log1p}\left(\mathsf{fma}\left(-3, a \cdot c, b \cdot b\right) \cdot \mathsf{fma}\left(-3, a \cdot c, b \cdot b\right)\right)\right) \cdot \mathsf{fma}\left(-3, a \cdot c, b \cdot b\right)\right)}^{\frac{1}{3}}}}, \sqrt{\sqrt{\mathsf{fma}\left(-3, a \cdot c, b \cdot b\right)}}, -b\right)}{3 \cdot a}double f(double a, double b, double c) {
double r3341511 = b;
double r3341512 = -r3341511;
double r3341513 = r3341511 * r3341511;
double r3341514 = 3.0;
double r3341515 = a;
double r3341516 = r3341514 * r3341515;
double r3341517 = c;
double r3341518 = r3341516 * r3341517;
double r3341519 = r3341513 - r3341518;
double r3341520 = sqrt(r3341519);
double r3341521 = r3341512 + r3341520;
double r3341522 = r3341521 / r3341516;
return r3341522;
}
double f(double a, double b, double c) {
double r3341523 = -3.0;
double r3341524 = a;
double r3341525 = c;
double r3341526 = r3341524 * r3341525;
double r3341527 = b;
double r3341528 = r3341527 * r3341527;
double r3341529 = fma(r3341523, r3341526, r3341528);
double r3341530 = r3341529 * r3341529;
double r3341531 = log1p(r3341530);
double r3341532 = expm1(r3341531);
double r3341533 = r3341532 * r3341529;
double r3341534 = 0.3333333333333333;
double r3341535 = pow(r3341533, r3341534);
double r3341536 = sqrt(r3341535);
double r3341537 = sqrt(r3341536);
double r3341538 = sqrt(r3341529);
double r3341539 = sqrt(r3341538);
double r3341540 = -r3341527;
double r3341541 = fma(r3341537, r3341539, r3341540);
double r3341542 = 3.0;
double r3341543 = r3341542 * r3341524;
double r3341544 = r3341541 / r3341543;
return r3341544;
}



Bits error versus a



Bits error versus b



Bits error versus c
Initial program 52.5
Simplified52.5
rmApplied add-sqr-sqrt52.5
Applied sqrt-prod52.3
Applied fma-neg51.7
rmApplied add-cbrt-cube51.8
rmApplied pow1/351.1
rmApplied expm1-log1p-u51.2
Final simplification51.2
herbie shell --seed 2019152 +o rules:numerics
(FPCore (a b c)
:name "Cubic critical, wide range"
:pre (and (< 4.930380657631324e-32 a 2.028240960365167e+31) (< 4.930380657631324e-32 b 2.028240960365167e+31) (< 4.930380657631324e-32 c 2.028240960365167e+31))
(/ (+ (- b) (sqrt (- (* b b) (* (* 3 a) c)))) (* 3 a)))