(FPCore (a b c)
:precision binary64
(/ (+ (- b) (sqrt (- (* b b) (* (* 3.0 a) c)))) (* 3.0 a)))
↓
(FPCore (a b c)
:precision binary64
(fma
-0.5625
(* (* a a) (* (* c c) (* c (pow b -5.0))))
(fma
-0.16666666666666666
(/ (* c (* (pow (* a c) 3.0) 6.328125)) (pow b 7.0))
(fma -0.375 (* a (/ c (/ (pow b 3.0) c))) (/ -0.5 (/ b c))))))
double code(double a, double b, double c) {
return (-b + sqrt(((b * b) - ((3.0 * a) * c)))) / (3.0 * a);
}
↓
double code(double a, double b, double c) {
return fma(-0.5625, ((a * a) * ((c * c) * (c * pow(b, -5.0)))), fma(-0.16666666666666666, ((c * (pow((a * c), 3.0) * 6.328125)) / pow(b, 7.0)), fma(-0.375, (a * (c / (pow(b, 3.0) / c))), (-0.5 / (b / c)))));
}
function code(a, b, c)
return Float64(Float64(Float64(-b) + sqrt(Float64(Float64(b * b) - Float64(Float64(3.0 * a) * c)))) / Float64(3.0 * a))
end
↓
function code(a, b, c)
return fma(-0.5625, Float64(Float64(a * a) * Float64(Float64(c * c) * Float64(c * (b ^ -5.0)))), fma(-0.16666666666666666, Float64(Float64(c * Float64((Float64(a * c) ^ 3.0) * 6.328125)) / (b ^ 7.0)), fma(-0.375, Float64(a * Float64(c / Float64((b ^ 3.0) / c))), Float64(-0.5 / Float64(b / c)))))
end
herbie shell --seed 2022221
(FPCore (a b c)
:name "Cubic critical, wide range"
:precision binary64
:pre (and (and (and (< 4.930380657631324e-32 a) (< a 2.028240960365167e+31)) (and (< 4.930380657631324e-32 b) (< b 2.028240960365167e+31))) (and (< 4.930380657631324e-32 c) (< c 2.028240960365167e+31)))
(/ (+ (- b) (sqrt (- (* b b) (* (* 3.0 a) c)))) (* 3.0 a)))