Effizientes Ändern der Gleitkommarundung in C und x86-Assembly
IEEE 754-Gleitkommazahlen bieten verschiedene Rundungsmodi, wie z. Null, positive Unendlichkeit und negative Unendlichkeit. Das Ändern des Rundungsmodus ermöglicht eine präzise Kontrolle über die dezimale Darstellung der Ergebnisse.
C-Lösung
Die C-Standardbibliothek bietet eine tragbare Lösung zum Ändern von Rundungsmodi durch fesetround( ) Funktion:
#include <fenv.h> #pragma STDC FENV_ACCESS ON int main() { // Save the original rounding mode int originalRounding = fegetround(); // Set the desired rounding mode (e.g., to zero) fesetround(FE_TOWARDZERO); // Perform operations with the adjusted rounding mode // Restore the original rounding mode fesetround(originalRounding); return 0; }
x86-Montagelösung
Für Auf Plattformen ohne C99-Unterstützung kann x86-Assembly verwendet werden, um sowohl die x87-Einheit als auch die SSE-Rundungsmodi zu ändern:
; x87 unit fldcw [new rounding mode] ; e.g., FNINIT to nearest ; SSE ldmxcsr [new rounding mode] ; e.g., MXCSR_RND_NEAREST
Microsoft Visual C
MSVC bietet die Nicht- Standardfunktion _controlfp() für diesen Zweck:
#include <math.h> int main() { // Save the original rounding mode unsigned int originalRounding = _controlfp(0, 0); // Set the desired rounding mode (e.g., to zero) _controlfp(_RC_CHOP, _MCW_RC); // Perform operations with the adjusted rounding mode // Restore the original rounding mode _controlfp(originalRounding, _MCW_RC); return 0; }
Rundungsmodus-Decoder Klingeln
Rounding Mode | C Name | MSVC Name |
---|---|---|
Nearest | FE_TONEAREST | _RC_NEAR |
Zero | FE_TOWARDZERO | _RC_CHOP |
Infinity | FE_UPWARD | _RC_UP |
-Infinity | FE_DOWNWARD | _RC_DOWN |
Das obige ist der detaillierte Inhalt vonWie kann ich Gleitkomma-Rundungsmodi in C- und x86-Assembly effizient steuern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!