Поскольку интегральный тип не может содержать те же интегральные значения, что и float
или double
.
int main(int argc, char *argv[]) {
std::cout << floor(std::numeric_limits<float>::max()) << std::endl;
std::cout << static_cast<long>(floor(std::numeric_limits<float>::max())) << ::endl;
}
выходы (на моей x86_64 архитектуры)
3.40282e+38
-9223372036854775808
Кроме того, значения с плавающей точкой могут содержать NaN, + Inf и -Inf, все из которых сохранились по floor()
операции. Ни одно из этих значений не может быть представлено интегральным типом.
int main(int argc, char *argv[]) {
std::cout << floor(std::numeric_limits<float>::quiet_NaN()) << std::endl;
std::cout << floor(std::numeric_limits<float>::infinity()) << std::endl;
std::cout << floor(-std::numeric_limits<float>::infinity()) << std::endl;
}
выходы
nan
inf
-inf
Предположительно по той же причине, что и [тег: C]. – Johnsyweb
related: http://stackoverflow.com/questions/511921/why-does-math-floor-return-a-double –
Какова ваша практическая проблема программирования? Вам нужна версия 'floor', которая возвращает int? –