Ja. Solange Sie den Empfangstyp nicht überlaufen.
Sie haben keine Bedenken hier: std::round(0.9)
-genau1.0
und so abzurunden wird wird i == 1
Der Standard besteht auf dem am nächsten Integralwert assumable von einem double
zurückgegeben garantiert.
Beachten Sie jedoch, dass für einen IEEE754 double
alle Werte über die 52. Potenz von 2 Integralwerte sind! Eine logische Folge davon ist, dass Ihre Kandidatennummer für die Rundung bereits ein ganzzahliger Wert ist, so dass die Funktion zu einem No-Op reduziert wird. Die Tatsache, dass zum Beispiel std::round(4503599627370496.5)
4503599627370496
zurückgibt, hat damit zu tun, dass 4503599627370496.5
in erster Linie nicht als double
dargestellt werden kann.
Als letzten technischen Punkt zu beachten, dass std::round
bemerkenswert gut erzogene ist, aufgrund der Tatsache, teilweise, dass jede Zahl der Form a.5
(das ist der cutover Punkt der deutschen Rundung) eine dyadischen rationalen ist und so kann im binären Gleitkomma genau dargestellt werden. Dies ist der Grund, warum ein alternativer Ansatz, wie z. B. das Hinzufügen von 0.5
und das Abschneiden, Bugs einbringen kann, da in diesem Fall Witzziffern eingeführt werden können.
http://en.cppreference.com/w/cpp/numeric/math/rint – Mat
@Mat soweit ich sehen kann ist der einzige Unterschied, dass 'runde' den aktuellen Rundungsmodus explizit nicht respektiert. Die Garantien sind ansonsten gleich. – BoBTFish
@BoBTFish: Die 'lrint'-Varianten liefern ganzzahlige Werte, keine ganzzahligen Werte im Fließkommaformat. Nicht ganz das gleiche (soweit ich es verstehe) – Mat