2017-09-08 3 views
4

Je voudrais comprendre pourquoiboost :: format donne des résultats différents que ronde

double nbr = 102262.5; 

boost::format("%.0f") % nbr; 

donne 102262 tout round(102262.5) donne 102263.0

Si nous prenons une autre valeur exemple 34087.5

boost::format("%.0f") % nbr 

donne 34088 et round(34087.5) donne le même 34088Cela signifie-t-il que round implémente un algorithme plus sophistiqué pour s'assurer que le format le plus proche ou printf ne l'est pas?

+0

Qu'est-ce que vous obtenez avec 'round (nbr)'? Différent n'est pas la même chose. –

+0

J'obtiens le même résultat avec round (nbr) qu'en utilisant la valeur littérale. – Bing

+0

faites-vous référence à 'std :: round' ou' boost :: round'? Quoi qu'il en soit, ils utilisent tous les deux le même arrondi, ce qui rend encore plus surprenant que boost :: format fonctionne différemment – user463035818

Répondre

7

Il existe une chose appelée "demi-ronde à pair" ou "demi-ronde à impaire" (link).

Ceci est une règle pour réduire le biais des erreurs d'arrondi et boost::format semble mettre en œuvre une telle stratégie. Essentiellement, il s'agit d'arrondir les cas de bris d'égalité (tels que 1,5 ou 2,5) de la même manière de façon déterministe (en fonction du nombre lui-même). Si l'on arrondissait toujours ces cas, un biais statistique pourrait être introduit en arrondissant. Ce dernier est le moyen le plus "classique" d'arrondir qui semble être mis en œuvre par round.

Notez que la stratégie implémentée par boost::format (demi-arrondi à pair) correspond au mode d'arrondi par défaut de la norme IEEE 754.

+0

Merci beaucoup, si efficacement, ils ne fonctionnent pas de la même manière. Et l'algorithme boost :: format est plus sophistiqué. – Bing

+0

Différent. Différentes stratégies d'arrondissement fonctionnent mieux pour différents domaines/applications. Il n'est jamais bon de supposer un arrondissement particulier s'il n'est pas documenté, et rarement une raison de s'attendre à ce que différentes bibliothèques utilisent la même chose. – sehe