В C89 floor() возвращает double. Гарантировано ли следующее?
double d = floor(3.0 + 0.5);
int x = (int) d;
assert(x == 3);
Я забочусь о том, что результат пола не может быть точно представлен в IEEE 754. Так что d получает что-то вроде 2.99999, а х заканчивается на 2.
Чтобы ответить на этот вопрос как "да", все целые числа в пределах интервала int должны быть точно представлены как двойники, а пол должен всегда возвращать точно отображаемое значение.