FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD
|
Definiert im Header
<cfenv>
|
||
|
#define FE_DOWNWARD /*implementation defined*/
|
(seit C++11) | |
|
#define FE_TONEAREST /*implementation defined*/
|
(seit C++11) | |
|
#define FE_TOWARDZERO /*implementation defined*/
|
(seit C++11) | |
|
#define FE_UPWARD /*implementation defined*/
|
(seit C++11) | |
Jede dieser Makrokonstanten wird zu einem nichtnegativen ganzzahligen konstanten Ausdruck expandiert, der mit
std::fesetround
und
std::fegetround
verwendet werden kann, um einen der unterstützten Gleitkomma-Rundungsmodi anzugeben. Die Implementierung kann zusätzliche Rundungsmodus-Konstanten in
<cfenv>
definieren, die alle mit
FE_
beginnen sollten, gefolgt von mindestens einem Großbuchstaben. Jedes Makro ist nur definiert, wenn es unterstützt wird.
| Konstante | Erklärung |
FE_DOWNWARD
|
Rundung gegen negative Unendlichkeit |
FE_TONEAREST
|
Rundung zum nächstgelegenen darstellbaren Wert |
FE_TOWARDZERO
|
Rundung gegen Null |
FE_UPWARD
|
Rundung gegen positive Unendlichkeit |
Zusätzliche Rundungsmodi können von einer Implementierung unterstützt werden.
Der aktuelle Rundungsmodus beeinflusst Folgendes:
- Ergebnisse von Gleitkomma- arithmetischen Operatoren außerhalb von konstanten Ausdrücken
double x = 1; x / 10; // 0.09999999999999999167332731531132594682276248931884765625 // oder 0.1000000000000000055511151231257827021181583404541015625
- Ergebnisse der Standardbibliothek mathematischen Funktionen
std::sqrt(2); // 1.41421356237309492343001693370752036571502685546875 // oder 1.4142135623730951454746218587388284504413604736328125
- Gleitkomma-zu-Gleitkomma implizite Konvertierung und Casts
double d = 1 + std::numeric_limits<double>::epsilon(); float f = d; // 1.00000000000000000000000 // oder 1.00000011920928955078125
- String-Konvertierungen wie std::strtod oder std::printf
std::stof("0.1"); // 0.0999999940395355224609375 // oder 0.100000001490116119384765625
- die Bibliotheksrundungsfunktionen std::nearbyint , std::rint , std::lrint
std::lrint(2.1); // 2 oder 3
Der aktuelle Rundungsmodus hat KEINE Auswirkung auf Folgendes:
- implizite Konvertierung und Casts von Gleitkommazahlen zu Ganzzahlen (immer in Richtung Null),
- Ergebnisse von Gleitkomma-Arithmetikoperatoren in Ausdrücken, die zur Compile-Zeit ausgeführt werden (immer zur nächsten),
- die Bibliotheksfunktionen std::round , std::lround , std::llround , std::ceil , std::floor , std::trunc .
Wie bei jeder Gleitkommaumgebung -Funktionalität ist das Runden nur garantiert, wenn #pragma STDC FENV_ACCESS ON gesetzt ist.
Compiler, die das Pragma nicht unterstützen, können ihre eigenen Möglichkeiten bieten, um den aktuellen Rundungsmodus zu unterstützen. Beispielsweise haben Clang und GCC die Option
-frounding-math
, die dazu dient, Optimierungen zu deaktivieren, die die Bedeutung von rundungsempfindlichem Code ändern würden.
Beispiel
#include <cfenv> #include <cmath> #include <iomanip> #include <iostream> #include <string> // #pragma STDC FENV_ACCESS ON int main() { std::fesetround(FE_DOWNWARD); std::cout << "Rundung abwärts: \n" << std::setprecision(50) << " pi = " << std::acos(-1.f) << '\n' << "stof(\"1.1\") = " << std::stof("1.1") << '\n' << " rint(2.1) = " << std::rint(2.1) << "\n\n"; std::fesetround(FE_UPWARD); std::cout << "Rundung aufwärts: \n" << " pi = " << std::acos(-1.f) << '\n' << "stof(\"1.1\") = " << std::stof("1.1") << '\n' << " rint(2.1) = " << std::rint(2.1) << '\n'; }
Ausgabe:
Rundung abwärts:
pi = 3.141592502593994140625
stof("1.1") = 1.099999904632568359375
rint(2.1) = 2
Rundung aufwärts:
pi = 3.1415927410125732421875
stof("1.1") = 1.10000002384185791015625
rint(2.1) = 3
Siehe auch
|
gibt Gleitkomma-Rundungsmodi an
(enum) |
|
|
(C++11)
(C++11)
|
ruft Rundungsrichtung ab oder setzt sie
(function) |
|
C-Dokumentation
für
Gleitkomma-Rundungsmakros
|
|