Il n'y a pas de raisons historiques, que ce soit. Ce genre de déviance a été autour depuis l'année dot. Folk le font quand ils sont sensation très, très méchant. C'est un grave abus de l'arithmétique à virgule flottante, et bon nombre de professionnels expérimentés programmeurs tomber pour elle. Même le Java bods n'a jusqu'à la version 1.7. Drôle de gars.
Ma conjecture est qu'un décent out-of-the-box allemande de l'arrondissement de la fonction n'a pas été officiellement disponible jusqu'à C++11 (malgré C l'obtention de leur en C99), mais c'est vraiment pas une excuse pour l'adoption de la dite alternative.
Voici la chose: floor(0.5 + input)
ne permet pas toujours de retrouver le même résultat que la correspondante std::round
appel!
La raison en est très subtil: le point de coupure pour un allemand de l'arrondissement, a.5
pour un entier a
est, par une coïncidence de la propriété de l'univers, une dyade rationnelle. Comme cela peut être représentée exactement dans un IEEE754 virgule flottante jusqu'à la 52e puissance de 2, et, par la suite, l'arrondi est un no-op de toute façon, std::round
fonctionne toujours correctement. Pour les autres à virgule flottante régimes, consultez la documentation.
Mais l'ajout d' 0.5
d'un double
peut introduire une imprécision, ce qui entraîne une légère sous ou de dépassement de certaines valeurs. Si vous pensez à ce sujet, l'ajout de deux double
valeurs - qui sont la création de l'involontaire dénaire la conversion et l'application d'une fonction qui est très fort en fonction de l'entrée (comme une fonction d'arrondi), est lié à la fin dans les larmes.
Ne pas le faire.
Référence: Pourquoi les Mathématiques.round(0.49999999999999994) return 1