\frac{\left(-b\right) + \sqrt{b \cdot b - \left(3 \cdot a\right) \cdot c}}{3 \cdot a}\frac{1}{\frac{a \cdot 3}{-a \cdot 3} \cdot \frac{b + \sqrt{\mathsf{fma}\left(b, b, \left(a \cdot c\right) \cdot \left(-3\right)\right)}}{c}}double f(double a, double b, double c) {
double r91087 = b;
double r91088 = -r91087;
double r91089 = r91087 * r91087;
double r91090 = 3.0;
double r91091 = a;
double r91092 = r91090 * r91091;
double r91093 = c;
double r91094 = r91092 * r91093;
double r91095 = r91089 - r91094;
double r91096 = sqrt(r91095);
double r91097 = r91088 + r91096;
double r91098 = r91097 / r91092;
return r91098;
}
double f(double a, double b, double c) {
double r91099 = 1.0;
double r91100 = a;
double r91101 = 3.0;
double r91102 = r91100 * r91101;
double r91103 = -r91102;
double r91104 = r91102 / r91103;
double r91105 = b;
double r91106 = c;
double r91107 = r91100 * r91106;
double r91108 = -r91101;
double r91109 = r91107 * r91108;
double r91110 = fma(r91105, r91105, r91109);
double r91111 = sqrt(r91110);
double r91112 = r91105 + r91111;
double r91113 = r91112 / r91106;
double r91114 = r91104 * r91113;
double r91115 = r91099 / r91114;
return r91115;
}



Bits error versus a



Bits error versus b



Bits error versus c
Initial program 28.4
Simplified28.4
rmApplied flip--28.4
Simplified0.6
Simplified0.6
rmApplied *-un-lft-identity0.6
Applied *-un-lft-identity0.6
Applied times-frac0.6
Applied associate-/l*0.6
Simplified0.4
Taylor expanded around 0 0.4
Simplified0.4
Final simplification0.4
herbie shell --seed 2019194 +o rules:numerics
(FPCore (a b c)
:name "Cubic critical, narrow range"
:pre (and (< 1.0536712127723509e-08 a 94906265.62425156) (< 1.0536712127723509e-08 b 94906265.62425156) (< 1.0536712127723509e-08 c 94906265.62425156))
(/ (+ (- b) (sqrt (- (* b b) (* (* 3.0 a) c)))) (* 3.0 a)))