2017-09-08 2 views
4

Ich mag würde verstehen, warumboost :: Format gibt unterschiedliche Ergebnisse als rund

double nbr = 102262.5; 

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

gibt 102262 während round(102262.5) gibt 102263.0

Wenn wir ein anderes Beispiel Wert nehmen 34087.5

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

gibt 34088 und round(34087.5) ergibt das gleiche 34088

Bedeutet es, dass round einen ausgefeilteren Algorithmus implementiert, um die nächste Ausgabe sicherzustellen, während das Format oder printf nicht funktioniert?

+0

Was bekommen Sie mit 'round (nbr)'? Anders ist nicht das Gleiche. –

+0

Ich bekomme das gleiche Ergebnis mit Runde (nbr) wie bei der Verwendung des Literalwertes. – Bing

+0

beziehen Sie sich auf 'std :: round' oder' boost :: round'? Jedenfalls benutzen beide die gleiche Rundung, was es noch überraschender macht, dass "boost :: format" anders funktioniert. – user463035818

Antwort

7

Es gibt eine Sache, die "Runde Hälfte zu gerade" oder "Runde Hälfte zu ungerade" (link) genannt wird.

Dies ist eine Regel zur Verringerung der Verzerrung von Rundungsfehlern und boost::format scheint eine solche Strategie zu implementieren. Im Wesentlichen ist dies, um die tie-breaking Fälle (wie 1,5 oder 2,5) gleichermaßen oft auf deterministische Weise (abhängig von der Zahl selbst) auf und ab zu runden. Würde man diese Fälle immer zusammenfassen oder abrunden, könnte durch Rundung eine statistische Verzerrung eingeführt werden. Letzteres ist die eher "klassische" Art der Rundung, die von round umgesetzt wird.

Beachten Sie, dass die von boost::format implementierte Strategie (runde Hälfte bis gerade) dem standardmäßigen Rundungsmodus im IEEE 754-Standard entspricht.

+0

Vielen Dank, so effektiv, dass sie nicht auf die gleiche Weise funktionieren. Und der Algorithmus von boost :: format ist ausgeklügelter. – Bing

+0

Anders. Verschiedene Rundungsstrategien funktionieren am besten für verschiedene Domänen/Anwendungen. Es ist nie gut, eine bestimmte Rundung anzunehmen, wenn sie nicht dokumentiert ist, und selten ein Grund zu erwarten, dass verschiedene Bibliotheken dieselben verwenden. – sehe

Verwandte Themen