2013-03-11 12 views
22

Gerade jetzt stolperte ich über die Tatsache, dass die C++ Funktion floor den gleichen Typ zurückgibt, den Sie ihm übergeben, sei es float, double oder so.Warum gibt floor keine Ganzzahl zurück?

Nach this reference, gibt die Funktion einen Abwärtsintegralwert gerundet. Warum ist das nicht eine ganze Zahl?

+0

Vermutlich aus dem gleichen Grund wie [tag: C]. – Johnsyweb

+2

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

+0

Was ist Ihr praktisches Programmierproblem? Benötigen Sie eine Version von 'floor', die einen int zurückgibt? –

Antwort

45

Da ein Integraltyp nicht unbedingt die gleichen Integralwerte wie float oder double enthalten kann.

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

Ausgänge (auf meiner Architektur x86_64)

3.40282e+38 
-9223372036854775808 

Zusätzlich Gleitkommawerte können halten NaN, + Inf und -Inf, von denen alle durch einen floor() Operation erhalten sind. Keiner dieser Werte kann mit einem ganzzahligen Typ dargestellt werden.

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

Ausgänge

nan 
inf 
-inf 
+0

+1 für die Abbildung. – Johnsyweb

+5

Diese Antwort ist besser als die angenommene Antwort in der Betrogenen. – Omnifarious

Verwandte Themen