/fp (Festlegen des Gleitkommaverhaltens)
Gibt das Gleitkommaverhalten in einer Quellcodedatei an.
/fp:[precise | except[-] | fast | strict ]
Flags
precise
Standard.Verbessert die Konsistenz von Gleitkommatests auf Gleichheit und Ungleichheit durch Deaktivierung von Optimierungen, die die Genauigkeit von Gleitkommaberechnungen beeinflussen können. Dies ist für strikte ANSI-Konformität erforderlich. Standardmäßig verwendet der Compiler die 80-Bit-Register des Coprozessors, um Zwischenergebnisse von Gleitkommaberechnungen zu speichern. Damit wird die Geschwindigkeit des Programms erhöht und die Größe verringert. Da die Berechnung mit Gleitkomma-Datentypen durchgeführt wird, die im Speicher weniger als 80 Bits belegen, kann die Verwendung der zusätzlichen Bits für die Genauigkeit (80 Bits minus der Anzahl der Bits in einem kleineren Gleitkommatyp) in längeren Berechnungen jedoch zu inkonsistenten Ergebnissen führen.
Mit /fp:precise auf x86-Prozessoren führt der Compiler eine Rundung bei Variablen des Typs Float auf die entsprechende Genauigkeit für Zuweisungen und Typumwandlungen durch, und wenn Parameter an eine Funktion übergeben werden. Durch diese Rundung wird gewährleistet, dass die Daten keinen höheren Stellenwert als die Kapazität ihres Typs beibehalten. Ein mit /fp:precise kompiliertes Programm kann langsamer und größer sein als eines, das ohne /fp:precise kompiliert wurde. Mit /fp:precise werden systeminterne Funktionen deaktiviert. Stattdessen werden die standardisierten Laufzeitbibliotheksroutinen verwendet. Weitere Informationen finden Sie unter /Oi (Systeminterne Funktionen erstellen).
Mit /fp:precise wird das folgende Gleitkommaverhalten aktiviert:
Zusammenziehungen oder das Austauschen mehrerer Operationen durch eine zusammengesetzte Operation mit einer einzigen Rundung am Ende werden mit /fp:precise aktiviert.
Ausdruckoptimierungen, die für spezielle Werte (NaN, +unendlich, -unendlich, +0, -0) ungültig sind, sind nicht zulässig. Die Optimierungen x-x => 0, x*0 => 0, x-0 => x, x+0 => x und 0-x => -x sind aus mehreren Gründen ungültig (siehe IEEE 754 und C99-Standard).
Der Compiler verarbeitet Vergleichsoperationen, einschließlich NaN, ordnungsgemäß. Beispielsweise ergibt x != x den Wert true, wenn x gleich NaN ist und geordnete Vergleichsoperationen, einschließlich NaN, eine Ausnahme auslösen.
Die Bewertung des Ausdrucks folgt C99 FLT_EVAL_METHOD=2 mit einer Ausnahme. Beim Programmieren für x86-Prozessoren wird die long double-Genauigkeit angewendet, da die FPU auf eine Genauigkeit von 53 Bits festgelegt ist.
Die Multiplikation mit exakt 1,0 wird umgewandelt in die Verwendung des anderen Faktors. x*y*1.0 wird umgewandelt in x*y. Entsprechend wird x*1.0*y in x*y umgewandelt.
Die Division durch exakt 1,0 wird in die Verwendung des Dividenden umgewandelt. x*y/1.0 wird umgewandelt in x*y. Entsprechend wird x/1.0*y in x*y umgewandelt.
Durch Verwendung von /fp:precise mit fenv_access ON werden einige Optimierungen, z. B. Auswertungen der Kompilierungszeit von Gleitkommaausdrücken, deaktiviert. Wenn Sie beispielsweise das Rundungsverhalten mit _control87, _controlfp, __control87_2 ändern und der Compiler eine Gleitkommaberechnung durchführt, wird das von Ihnen angegebene Rundungsverhalten nicht angewendet, bis fenv_access auf ON festgelegt wird.
Die Compileroption /Op wird ersetzt durch /fp:precise.
fast
Erstellt in den meisten Fällen den schnellstmöglichen Code. /fp:fast kann nicht mit /fp:strict oder /fp:precise verwendet werden, die letzte in der Befehlszeile angegebene Option wird verwendet. /fp:fast und /fp:except verursachen einen Compilerfehler.Die Auswahl von /Za, /Ze (Spracherweiterungen deaktivieren) (ANSI-Kompatibilität) und /fp:fast führt möglicherweise zu unerwartetem Verhalten. Zum Beispiel werden Gleitkommaoperationen mit einfacher Genauigkeit möglicherweise nicht auf einfache Genauigkeit gerundet.
except[-]
Zuverlässiges Gleitkomma-Ausnahmemodell. Ausnahmen werden nach ihrem Auslösen sofort angewendet. Diese Option ist standardmäßig deaktiviert. Durch Hinzufügen eines Minuszeichens zur Option wird diese explizit deaktiviert.strict
Das genaueste Gleitkomma-Modell. /fp:strict führt dazu, dass fp_contract auf OFF und fenv_access auf ON festgelegt wird. /fp:except wird impliziert und kann durch die explizite Festlegung von /fp:except- deaktiviert werden. Wird /fp:strict zusammen mit /fp:except- verwendet, wird eine strikte Gleitkommasemantik erzwungen, jedoch ohne Beachtung von Ausnahmeereignissen.
Hinweise
Mehrere /fp-Optionen können in der gleichen Kompilierung angegeben werden.
Informationen zum Steuern des Gleitkommaverhaltens für eine Funktion finden Sie im float_control-Pragma.
Die meisten Gleitkommaoptimierungen für die Pragmas /fp:strict, /fp:except (sowie zugehörige Pragmas) und fp_contract sind abhängig vom Computer. /fp:strict und /fp:except sind mit /clr nicht kompatibel.
/fp:precise sollte den meisten Gleitkommaanforderungen einer Anwendung entsprechen. Gegebenenfalls können Sie /fp:except und /fp:strict verwenden, dies kann jedoch zu einer Abnahme der Leistung führen. Liegt die Priorität auf der Leistung, sollten Sie /fp:fast verwenden.
/fp:strict, /fp:fast und /fp:precise sind Präzisionsmodi (Korrektheit). Es kann jeweils nur ein Modus aktiv sein. Wenn /fp:strict und /fp:precise angegeben wurden, wird vom Compiler der Modus verwendet, der zuletzt verarbeitet wird. /fp:strict und /fp:fast können nicht gleichzeitig angegeben werden.
Weitere Informationen finden Sie unter https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/floapoint.asp.
So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest
Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Ausführliche Informationen finden Sie unter Gewusst wie: Öffnen von Projekteigenschaftenseiten.
Erweitern Sie den Knoten Konfigurationseigenschaften.
Erweitern Sie den Knoten C/C++.
Wählen Sie die Eigenschaftenseite Codegenerierung aus.
Ändern Sie die Eigenschaft Gleitkommamodell.
So legen Sie diese Compileroption programmgesteuert fest
- Siehe floatingPointModel.