Portables Anpassen des Gleitkomma-Rundungsverhaltens
Die Notwendigkeit, den IEEE 754-Rundungsmodus zu ändern, entsteht in verschiedenen Szenarien. In diesem Artikel werden effiziente Methoden erläutert, um dies zu erreichen, sowohl in portablem C als auch in der x86-Assemblersprache.
C-Lösung
C99 bietet eine umfassende Lösung für die Manipulation von Rundungsmodi:
#include <fenv.h> #pragma STDC FENV_ACCESS ON int main() { // Preserve the initial rounding mode const int roundingMode = fegetround(); // Set the desired rounding mode (towards zero) fesetround(FE_TOWARDZERO); // Perform floating-point operations... // Revert to the original rounding mode fesetround(roundingMode); return 0; }
x86-Montagelösung
Ein Plattformen, die C99 nicht unterstützen, bietet x86-Assembly eine Alternative:
x87-Gleitkomma-Einheit:Verwenden Sie fldcw, um den Rundungsmodus anzupassen.
SSE-Einheit: Verwenden Sie ldmxcsr, um die SIMD-Rundung zu konfigurieren Modus.
MSVC-spezifische Lösung
Microsoft Visual C bietet die nicht standardmäßige _controlfp()-Funktion:
unsigned int roundingMode = _controlfp(0, 0); _controlfp(_RC_CHOP, _MCW_RC); // ... _controlfp(roundingMode, _MCW_RC);
Rundung Moduskonstanten
Die folgende Tabelle enthält eine Referenz für den Rundungsmodus Konstanten:
Rounding Mode | C Name | MSVC Name |
---|---|---|
Nearest | FE_TONEAREST | _RC_NEAR |
Towards Zero | FE_TOWARDZERO | _RC_CHOP |
Positive Infinity | FE_UPWARD | _RC_UP |
Negative Infinity | FE_DOWNWARD | _RC_DOWN |
Das obige ist der detaillierte Inhalt vonWie kann ich das Gleitkomma-Rundungsverhalten in C und Assembly portabel anpassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!