2013-03-11 14 views
22

Właśnie natknąłem się na fakt, że funkcja C++ floor zwraca ten sam typ, jaki mu się podoba, czy to float,lub inny.Dlaczego floor nie zwraca liczby całkowitej?

Zgodnie z , funkcja zwraca zaokrągloną wartość całkowitą w dół. Dlaczego nie jest to liczba całkowita?

+0

prawdopodobnie z tego samego powodu, [Tag: C]. – Johnsyweb

+2

powiązane: http://stackoverflow.com/questions/511921/why-does-math-floor-return--double –

+0

Jaki jest twój praktyczny problem z programowaniem? Czy potrzebujesz wersji 'floor', która zwraca int? –

Odpowiedz

45

Ponieważ typ integralny niekoniecznie musi zawierać takie same wartości całkowite jak float lub 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; 
} 

wyjścia (na moim architektury x86_64)

3.40282e+38 
-9223372036854775808 

Dodatkowo, wartości zmiennoprzecinkowych może pomieścić NaN, + Inf, a -Inf, z których wszystkie są zachowane przez operację floor(). Żadna z tych wartości nie może być reprezentowana przez typ integralny.

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; 
} 

wyjścia

nan 
inf 
-inf 
+0

+1 dla ilustracji. – Johnsyweb

+5

Ta odpowiedź jest lepsza niż zaakceptowana odpowiedź w dupe. – Omnifarious

Powiązane problemy