Heim > Backend-Entwicklung > C++ > Wie kann ich Gleitkomma-Rundungsmodi in C- und x86-Assembly effizient steuern?

Wie kann ich Gleitkomma-Rundungsmodi in C- und x86-Assembly effizient steuern?

Barbara Streisand
Freigeben: 2024-11-27 12:41:14
Original
407 Leute haben es durchsucht

How Can I Efficiently Control Floating-Point Rounding Modes in C and x86 Assembly?

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;
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage