I always use the min and max macros for ints. I'm not sure why anyone would use fmin or fmax for integer values.
The big gotcha with min and max is that they're not functions, even if they look like them. If you do something like:
min (10, BigExpensiveFunctionCall())
That function call may get called twice depending on the implementation of the macro. As such, its best practice in my org to never call min or max with things that aren't a literal or variable.