Frage

Meine Anwendung erzeugt verschiedene Gleitkommawerte, wenn ich es im Release-Modus kompilieren und im Debug-Modus. Der einzige Grund, dass ich herausgefunden hat, das ich ein binäres Trace-Protokoll und das eine von Release-Build speichere jemals so etwas weg von dem Debug-Build, es wie die unteren zwei Bits des Float-Wertes 32 Bit sieht unterschiedlich sind etwa 1/2 die Fälle.

Möchten Sie diese „Differenz“ betrachten ein Bug zu sein oder würde diese Art von Unterschied zu erwarten. Würde dies einen Compiler Fehler oder eine interne Bibliothek Fehler sein.

Zum Beispiel:

LEFTPOS and SPACING are defined floating point values.
float def_x;
int xpos;

def_x = LEFTPOS + (xpos * (SPACING / 2));

Die Frage ist, in Bezug auf den X360-Compiler.

War es hilfreich?

Lösung

Release-Modus eine andere FP-Strategie haben kann. Es gibt verschiedene Gleitpunktarithmetik Modi auf der Ebene der Optimierung je Sie möchten. MSVC zum Beispiel hat strenge, schnell und präzise Modi.

Andere Tipps

Ich weiß, dass auf dem PC, Floating-Point-Register sind 80 Bit breit. Also, wenn eine Berechnung vollständig innerhalb der FPU erledigt ist, Sie den Vorteil von 80 Bit Genauigkeit erhalten. Auf der anderen Seite, wenn ein Zwischenergebnis wird in ein normales Register und wieder ausgezogen, wird es auf 32 Bit gekürzt, die unterschiedliche Ergebnisse.

Betrachten wir nun, dass ein Release-Build-Optimierungen haben wird, die in FPU Register Zwischenergebnisse halten, während ein Debug-Build wird naiv wahrscheinlich Zwischenergebnisse kopieren hin und her zwischen Speicher und Register - und da Sie Ihre Unterschied im Verhalten haben

Ich weiß nicht, ob dies auf X360 geschieht auch, oder nicht.

half ich ein Mitarbeiter einen Compiler-Schalter finden, die in Release vs. debug anders war Builds das war seine Differenzen verursachen.

Hier finden Sie aktuelle / fp (Geben Sie Gleitkommatypen Verhalten) .

Es ist kein Fehler. Jede Gleitkomma uperation hat eine gewisse Ungenauigkeit. Im Release-Modus wird eine Optimierung der Reihenfolge der Operationen ändern und Sie werden ein etwas anderes Ergebnis. Die Differenz sollte zwar klein, sein. Wenn es groß ist möglicherweise andere Probleme haben.

Zusätzlich zu den verschiedenen Floating-Point-Modi andere haben darauf hingewiesen, SSE oder similiar Vektor Optimierungen kann für die Freigabe eingeschaltet werden. Konvertieren von Fließkommaarithmetik von Standard Registern Vektorregister kann einen Einfluss auf den unteren Bits der Ergebnisse haben, wie die Vektorregister im Allgemeinen schmaler sein (weniger Bits) als das Standard-Floating-Point-Register.

Nicht ein Fehler. Diese Art des Unterschiedes ist zu erwarten.

Zum Beispiel haben einige Plattformen Schwimmers Register, die mehr Bits verwenden, als in einem Speicher gespeichert werden, so dass ein Wert in dem Register zu halten, kann ein leicht unterschiedliches Ergebnis ergibt im Vergleich zu Speicher in dem Speicher und Nachladen aus dem Speicher.

Diese Diskrepanz kann sehr gut durch die Compiler-Optimierung verursacht werden, die typischerweise in dem Freigabemodus, aber nicht im Debug-Modus durchgeführt wird. Zum Beispiel kann der Compiler einige der Operationen neu anordnen Ausführung zu beschleunigen, was einen leichten Unterschied in dem Gleitkomma-Ergebnis möglicherweise verursachen kann.

Also, ich würde sagen, wahrscheinlich ist es kein Fehler ist. Wenn Sie wirklich besorgt darüber sind, versuchen Sie auf Optimierung im Debug-Modus drehen.

Wie andere erwähnt, Gleitkommaregister haben eine höhere Präzision als Schwimmer, so dass die Genauigkeit des Endergebnisses hängt von der Registerzuweisung.

Wenn Sie konsistente Ergebnisse benötigen, können Sie die Variablen flüchtig machen, die in langsamer, weniger präzise führen, aber konsistenten Ergebnissen.

Wenn Sie einen Compiler-Schalter eingestellt, die den Compiler erlaubt Gleitkommaoperationen neu zu ordnen, - z.B. / Fp. Schnell - es dann offensichtlich ist kein Fehler

Wenn Sie keinen solchen Schalter eingestellt haben, dann ist es ein Bug - die C- und C ++ Standards erlauben nicht die Compiler-Operationen ohne Ihre Erlaubnis neu zu ordnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top