Add float/double overloads for floor/ceil
Move common floor() code into floorImpl()
Convert isNan/isInfinite into generic functions, add compile-time float path