`:=`(f, proc (x) options operator, arrow; `/`(`*`(`^`(`+`(`*`(2, `*`(x)), 3), 2), `*`(`^`(`+`(x, `-`(3)), 2))), `*`(`^`(x, 3), `*`(`^`(`+`(x, `-`(5)), 2)))) end proc) 

proc (x) options operator, arrow; `/`(`*`(`^`(`+`(`*`(2, `*`(x)), 3), 2), `*`(`^`(`+`(x, `-`(3)), 2))), `*`(`^`(x, 3), `*`(`^`(`+`(x, `-`(5)), 2)))) end proc (1)
 

`:=`(fp, D(f)); -1 

`:=`(fpp, D(fp)); -1 

evalf(solve(fp(x) = 0, x)) 

-1.500000000, 3., -5.482133788, `+`(2.491066892, `-`(`*`(2.471297169, `*`(I)))), `+`(2.491066892, `*`(2.471297169, `*`(I))) (2)
 

evalf(solve(fpp(x) = 0, x)) 

`+`(2.757114660, `*`(.8464569895, `*`(I))), `+`(2.302365720, `*`(3.888254729, `*`(I))), -1.950516122, -9.168444638, `+`(2.302365720, `-`(`*`(3.888254729, `*`(I)))), `+`(2.757114660, `-`(`*`(.846456989...
`+`(2.757114660, `*`(.8464569895, `*`(I))), `+`(2.302365720, `*`(3.888254729, `*`(I))), -1.950516122, -9.168444638, `+`(2.302365720, `-`(`*`(3.888254729, `*`(I)))), `+`(2.757114660, `-`(`*`(.846456989...
(3)
 

fp is the derivative;  fpp is the 2nd derivative.  The next two commands did a floating-point approximation of the zeros of fp and fpp, respectively.  Capital 'I' is the imaginary unit.  We're not interested in nonreal roots. 

 

What I've left out is where fp or fpp are undefined.  You should be able to see rather easily that they'll correspond to values of x where f, itself, is undefined.