(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.16666666666666666
(/ (* (pow (* c a) 4.0) 6.328125) (* a (pow b 7.0)))
(fma
-0.5625
(* (/ (* a a) (pow b 5.0)) (pow c 3.0))
(fma -0.375 (* a (/ (* c c) (pow b 3.0))) (/ (* c -0.5) b)))))
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.16666666666666666, ((pow((c * a), 4.0) * 6.328125) / (a * pow(b, 7.0))), fma(-0.5625, (((a * a) / pow(b, 5.0)) * pow(c, 3.0)), fma(-0.375, (a * ((c * c) / pow(b, 3.0))), ((c * -0.5) / b))));
}
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.16666666666666666, Float64(Float64((Float64(c * a) ^ 4.0) * 6.328125) / Float64(a * (b ^ 7.0))), fma(-0.5625, Float64(Float64(Float64(a * a) / (b ^ 5.0)) * (c ^ 3.0)), fma(-0.375, Float64(a * Float64(Float64(c * c) / (b ^ 3.0))), Float64(Float64(c * -0.5) / b))))
end
herbie shell --seed 2022212
(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)))