Kann jemand dieses Verhalten erklären? Ich bin mir der Darstellung von Gleitkommazahlen auf Maschinenebene sehr wohl bewusst. Dies scheint mit printf und seinen Formaten zu tun zu haben. Beide Zahlen werden genau durch Fließkomma-Notation dargestellt (Check: Multiplikation mit 64 ergibt eine ganze Zahl).printf-Rundungsverhalten für Doppel
#include <stdio.h>
#include <iostream>
using namespace std;
int main() {
double x1=108.765625;
printf("%34.30f\n", x1);
printf("%9.5f\n", x1);
printf("%34.30f\n", x1*64);
double x2=108.046875;
printf("%34.30lf\n", x2);
printf("%9.5f\n", x2);
printf("%34.30f\n", x2*64);
}
Output:
> 108.765625000000000000000000000000
> 108.76562
> 6961.000000000000000000000000000000
> 108.046875000000000000000000000000
> 108.04688
> 6915.000000000000000000000000000000
Note, wird die erste Zahl abgerundet, und die zweite wird aufgerundet.
Sie könnten in meinem Artikel http://www.exploringbinary.com/inconsistentroundingof-printed-floating-point-numbers/ interessiert sein. Einige Implementierungen verwenden "Rund-halb-weg von Null" anstelle von "halb-zu-gerade". –
Es scheint, dass Microsoft das standardmäßige Rundungsverhalten zwischen VS 2010 und VS2015 geändert hat. Ich habe gerade von einem auf den anderen aufgerüstet und einige sehr nervige und subtile Bugs bekommen. [Dieses Blog] (https://blogs.msdn.microsoft.com/vcblog/2014/06/18/c-runtime-crt-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1 /) ist wahrscheinlich dazu gedacht, die Veränderung hervorzuheben, aber es wäre dir verziehen, sie komplett zu verpassen. – omatai
es hängt von der Implementierung ab [Rundungsdifferenzen auf Windows vs Unix-basierten System in Sprintf] (http://Stackoverflow.com/q/4649554/995714), [C++ Rundungsverhalten Konsistenz für Bindungen mit Sprintf] (http: // Stackoverflow. com/q/31142600/995714) –