FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD
| Definiert in Header <cfenv> |
||
| #define FE_DOWNWARD /*implementierungsdefiniert*/ |
(seit C++11) | |
| #define FE_TONEAREST /*implementierungsdefiniert*/ |
(seit C++11) | |
| #define FE_TOWARDZERO /*implementierungsdefiniert*/ |
(seit C++11) | |
| #define FE_UPWARD /*implementierungsdefiniert*/ |
(seit C++11) | |
Jede dieser Makrokonstanten expandiert zu einem nicht-negativen ganzzahligen konstanten Ausdruck, 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_ gefolgt von mindestens einem Großbuchstaben beginnen sollten. Jedes Makro wird nur definiert, wenn es unterstützt wird.
| Konstante | Erklärung |
FE_DOWNWARD
|
Rundung gegen unendlich |
FE_TONEAREST
|
Rundung zum nächstgelegenen darstellbaren Wert |
FE_TOWARDZERO
|
Rundung gegen Null |
FE_UPWARD
|
Rundung gegen positives Unendlich |
Weitere Rundungsmodi können von einer Implementierung unterstützt werden.
Der aktuelle Rundungsmodus beeinflusst die folgenden
- Ergebnisse von Gleitkomma- arithmetischen Operatoren außerhalb von konstanten Ausdrücken
double x = 1; x / 10; // 0.09999999999999999167332731531132594682276248931884765625 // or 0.1000000000000000055511151231257827021181583404541015625
- Ergebnisse von Standard-Mathematikfunktionen
std::sqrt(2); // 1.41421356237309492343001693370752036571502685546875 // or 1.4142135623730951454746218587388284504413604736328125
- implizite Konvertierungen und Casts von Gleitkomma- zu Gleitkommazahlen
double d = 1 + std::numeric_limits<double>::epsilon(); float f = d; // 1.00000000000000000000000 // or 1.00000011920928955078125
- String-Konvertierungen wie std::strtod oder std::printf
std::stof("0.1"); // 0.0999999940395355224609375 // or 0.100000001490116119384765625
- die Rundungsfunktionen der Bibliothek std::nearbyint, std::rint, std::lrint
std::lrint(2.1); // 2 or 3
Der aktuelle Rundungsmodus beeinflusst NICHT die folgenden
- implizite Konvertierungen und Casts von Gleitkomma- zu Ganzzahlen (immer gegen Null),
- Ergebnisse von Gleitkomma-arithmetischen Operatoren in zur Kompilierzeit ausgeführten Ausdrücken (immer zum nächsten).
- die Bibliotheksfunktionen std::round, std::lround, std::llround, std::ceil, std::floor, std::trunc.
Wie bei jeder Funktionalität der Gleitkomma-Umgebung ist die Rundung nur garantiert, wenn #pragma STDC FENV_ACCESS ON gesetzt ist.
Compiler, die das Pragma nicht unterstützen, bieten möglicherweise eigene Möglichkeiten zur Unterstützung des aktuellen Rundungsmodus. Zum Beispiel haben Clang und GCC die Option -frounding-math, die dazu dient, Optimierungen zu deaktivieren, die die Bedeutung von rundungssensitiven Code verändern würden.
[edit] Beispiel
#include <cfenv> #include <cmath> #include <iomanip> #include <iostream> #include <string> // #pragma STDC FENV_ACCESS ON int main() { std::fesetround(FE_DOWNWARD); std::cout << "rounding down: \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 << "rounding up: \n" << " pi = " << std::acos(-1.f) << '\n' << "stof(\"1.1\") = " << std::stof("1.1") << '\n' << " rint(2.1) = " << std::rint(2.1) << '\n'; }
Ausgabe
rounding down:
pi = 3.141592502593994140625
stof("1.1") = 1.099999904632568359375
rint(2.1) = 2
rounding up:
pi = 3.1415927410125732421875
stof("1.1") = 1.10000002384185791015625
rint(2.1) = 3[edit] Siehe auch
| zeigt Gleitkomma-Rundungsmodi an (enum) | |
| (C++11)(C++11) |
holt oder setzt die Rundungsrichtung (function) |
| C-Dokumentation für Gleitkomma-Rundungs-Makros
| |