2013-03-11 4 views
22

Только что я наткнулся на факт, что функция C++ floor возвращает тот же тип, который вы передаете ему, будь то float, double или такой.Почему пол не возвращает целое число?

Согласно this reference, функция возвращает округленное целочисленное значение. Почему это не целое?

+0

Предположительно по той же причине, что и [тег: C]. – Johnsyweb

+2

related: http://stackoverflow.com/questions/511921/why-does-math-floor-return-a-double –

+0

Какова ваша практическая проблема программирования? Вам нужна версия 'floor', которая возвращает int? –

ответ

45

Поскольку интегральный тип не может содержать те же интегральные значения, что и 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 
+0

+1 для иллюстрации. – Johnsyweb

+5

Этот ответ лучше, чем принятый ответ в обмане. – Omnifarious

Смежные вопросы