Ich habe den folgenden sehr einfachen Code -
%Vor%Ich bekomme die Ausgabe
%Vor%aber wenn ich es zu
ändere %Vor%Ausgaben
%Vor%Ich verstehe, dass es etwas damit zu tun hat, dass z das Ergebnis int aber warum ist es in beiden Fällen anders?
Danke,
BEARBEITEN - Ich benutze ubuntu 10.10 GCC Build
int z = 0,7 · x;
Der Wert 0,7 mit doppelter Genauigkeit ist nicht genau als Fließkommazahl darstellbar; Seine hexadezimale Darstellung ist 3fe6666666666666 auf den meisten Maschinen, was weniger ist als der wahre Wert 3fe6666666666666 ... Also ist das Ergebnis der doppelten Genauigkeit von 0,7 * x kleiner als sein wahrer Wert und wird abgerundet. Das ist richtiges Verhalten.
int z = 0,7 · 15000;
Der Compiler dagegen ist schlau genug, um zu sehen, dass 0.7 * 15000 genau wie 7 * 1500 = 10500 darstellbar ist. Er verwendet also das korrekte Ergebnis anstelle des Ergebnisses, das durch das Kompilieren des Ausdrucks und erhalten würde es ausführend.
Ich vermute, dass es wegen des Compilers arithmetische Ausdrücke zur Kompilierzeit vereinfacht.
Der erste Ausdruck wurde mit FPU (mit endlicher Genauigkeit) und der zweite mit Präprozessor (mit "unendlicher" Genauigkeit) berechnet. Versuchen Sie, das Programm im Freigabemodus auszuführen (oder mit -O2
), die Ergebnisse sollten für beide Ausdrücke identisch sein.
Ich denke, Ruslik hat die richtige Antwort auf Ihre Frage.
Ich würde nur hinzufügen: Halten Sie Ihre Berechnungen immer im Float oder Double bis zum allerletzten Moment. Auf diese Weise verlieren Sie nicht die Präzision.
Versuchen Sie, Ihren Code folgendermaßen zu ändern:
%Vor%oder
%Vor%Tags und Links c++