Manipulation von Gleitkomma-Rundungsmodi: Ein effizienter Ansatz
Die Verbesserung von Gleitkomma-Operationen erfordert häufig die Steuerung ihres Rundungsmodus, der bestimmt, wie die Ergebnisse aussehen werden nach Berechnungen gerundet. In diesem Artikel werden die effizientesten Techniken zum Ändern des Rundungsmodus untersucht, die sowohl tragbare C-Funktionen als auch x86-Assembly-Lösungen berücksichtigen.
Portable C-Funktion:
Der C99-Standard bietet die Funktionen fegetround() und fesetround() zum Abrufen und Festlegen des Rundungsmodus. Hier ist ein Codeausschnitt, der ihre Verwendung zeigt:
#include <fenv.h> #pragma STDC FENV_ACCESS ON int main() { // Store the initial rounding mode int originalRounding = fegetround(); // Set the rounding mode to round towards zero fesetround(FE_TOWARDZERO); // Perform calculations and rounding operations // Reset the original rounding mode fesetround(originalRounding); return 0; }
x86-Assembly-Lösung:
Wenn Sie auf Plattformen ohne C99-Unterstützung abzielen, greifen Sie auf x86-Assembly-Anweisungen zurück, um die Rundungsmodi zu manipulieren . Dies erfordert die Einstellung sowohl für die x87-Einheit (über fldcw) als auch für SSE (über ldmxcsr).
MSVC-spezifische Lösung:
Für Microsoft Visual C (MSVC), Nutzen Sie die nicht standardmäßige Funktion _controlfp() anstelle der Assembly Ansatz.
unsigned int originalRounding = _controlfp(0, 0); _controlfp(_RC_CHOP, _MCW_RC); // Perform calculations and rounding operations _controlfp(originalRounding, _MCW_RC);
Rundungsmodus-Decoderring:
Als Referenz finden Sie hier einen Decoderring für die verschiedenen Rundungsmodi und die entsprechenden C- und MSVC-Makros:
Rounding Mode | C Macro | MSVC Macro |
---|---|---|
Nearest | FE_TONEAREST | _RC_NEAR |
Towards Zero | FE_TOWARDZERO | _RC_CHOP |
Towards Infinity | FE_UPWARD | _RC_UP |
Towards -Infinity | FE_DOWNWARD | _RC_DOWN |
Diese Techniken bieten effiziente Mittel zur Steuerung von Gleitkomma-Rundungsmodi und ermöglichen optimierte Berechnungen und Ergebnisse.
Das obige ist der detaillierte Inhalt vonWie kann ich Gleitkomma-Rundungsmodi in C und Assembly effizient manipulieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!