static_cast <int> (std::floor(x));
fait à peu près ce que vous voulez, oui. Il vous donne l'entier le plus proche, arrondi vers -infinity. Au moins tant que votre entrée est dans la plage représentable par ints. Je ne suis pas sûr de ce que vous entendez par 'ajouter .5 et autres joyeusetés, mais il n'aura pas le même effet
Et std :: floor renvoie un double parce que c'est le plus général. Parfois, vous pourriez vouloir arrondir un flotteur ou un double, mais conserver le type. C'est-à-dire, arrondir 1.3f à 1.0f, plutôt qu'à 1.
Ce serait difficile à faire si std :: floor renvoyait un int. (ou au moins vous auriez une distribution supplémentaire inutile ralentissant les choses).
Si floor n'effectue que l'arrondi lui-même, sans changer le type, vous pouvez le convertir en int si/quand vous en avez besoin.
Une autre raison est que la gamme de doubles est beaucoup plus grande que celle de ints. Il ne sera peut-être pas possible d'arrondir tous les doubles à ints.
donc, s'il est dans la bonne gamme, la distribution est très bien Où est-il dit (ce qui implique) cela dans la spécification? ? –
Eh bien, il y a deux opérations ici: std :: floor, et la distribution std :: floor est destinée à renvoyer un entier, et la distribution est spécifiée en termes d'une valeur entière Tant que std :: floor retourne une valeur qui est vraiment un entier exact, je ca pas voir à quel point cela aurait du sens d'échouer. –
Comment floor pourrait-il retourner quelque chose qui n'est pas un entier exact? Pour les petits doubles (epsilon << 1), toutes les valeurs entières peuvent être représentées, y compris floor (x). Pour les grands doubles (epsilon >> 1), seules les valeurs intégrales peuvent être représentées, donc floor (x) == x. – MSalters