std:: rint, std:: rintf, std:: rintl, std:: lrint, std:: lrintf, std:: lrintl, std:: llrint, std:: llrintf
|
Definiert im Header
<cmath>
|
||
|
Rundung auf Gleitkommatypen
|
||
| (1) | ||
|
float
rint
(
float
num
)
;
double
rint
(
double
num
)
;
|
(seit C++11)
(bis C++23) |
|
|
/* floating-point-type */
rint
(
/* floating-point-type */
num
)
;
|
(seit C++23) | |
|
float
rintf
(
float
num
)
;
|
(2) | (seit C++11) |
|
long
double
rintl
(
long
double
num
)
;
|
(3) | (seit C++11) |
|
Rundung zu
long
|
||
| (4) | ||
|
long
lrint
(
float
num
)
;
long
lrint
(
double
num
)
;
|
(seit C++11)
(bis C++23) |
|
|
long
lrint
(
/* Gleitkommatyp */
num
)
;
|
(seit C++23) | |
|
long
lrintf
(
float
num
)
;
|
(5) | (seit C++11) |
|
long
lrintl
(
long
double
num
)
;
|
(6) | (seit C++11) |
|
Rundung zu
long
long
|
||
| (7) | ||
|
long
long
llrint
(
float
num
)
;
long
long
llrint
(
double
num
)
;
|
(seit C++11)
(bis C++23) |
|
|
long
long
llrint
(
/* floating-point-type */
num
)
;
|
(seit C++23) | |
|
long
long
llrintf
(
float
num
)
;
|
(8) | (seit C++11) |
|
long
long
llrintl
(
long
double
num
)
;
|
(9) | (seit C++11) |
|
Definiert im Header
<cmath>
|
||
|
template
<
class
Integer
>
double rint ( Integer num ) ; |
(A) | (seit C++11) |
|
template
<
class
Integer
>
long lrint ( Integer num ) ; |
(B) | (seit C++11) |
|
template
<
class
Integer
>
long long llrint ( Integer num ) ; |
(C) | (seit C++11) |
std::rint
für alle cv-unqualifizierten Fließkommatypen als Typ des Parameters
num
an.
(seit C++23)
std::lrint
und
std::llrint
für alle cv-unqualifizierten Fließkommatypen als Typ des Parameters
num
.
(since C++23)
Inhaltsverzeichnis |
Parameter
| num | - | Gleitkomma- oder Ganzzahlwert |
Rückgabewert
Wenn keine Fehler auftreten, wird der nächstgelegene ganzzahlige Wert zu num , entsprechend dem aktuellen Rundungsmodus , zurückgegeben.
Fehlerbehandlung
Fehler werden gemeldet, wie in math_errhandling spezifiziert.
Wenn das Ergebnis von
std::lrint
oder
std::llrint
außerhalb des durch den Rückgabetyp darstellbaren Bereichs liegt, kann ein Domänenfehler oder ein Bereichsfehler auftreten.
Wenn die Implementierung IEEE-Gleitkommaarithmetik (IEC 60559) unterstützt,
-
Für die
std::rintFunktion:
- Wenn num ±∞ ist, wird es unverändert zurückgegeben.
- Wenn num ±0 ist, wird es unverändert zurückgegeben.
- Wenn num NaN ist, wird NaN zurückgegeben.
-
Für
std::lrintundstd::llrintFunktionen:
- Wenn num ±∞ ist, wird FE_INVALID ausgelöst und ein implementierungsdefinierter Wert zurückgegeben.
- Wenn das Ergebnis der Rundung außerhalb des Wertebereichs des Rückgabetyps liegt, wird FE_INVALID ausgelöst und ein implementierungsdefinierter Wert zurückgegeben.
- Wenn num NaN ist, wird FE_INVALID ausgelöst und ein implementierungsdefinierter Wert zurückgegeben.
Hinweise
POSIX legt fest
, dass alle Fälle, in denen
std::lrint
oder
std::llrint
FE_INEXACT
auslösen, Domänenfehler sind.
Wie in
math_errhandling
spezifiziert,
kann
FE_INEXACT
(muss aber nicht auf Nicht-IEEE-Fließkomma-Plattformen) von
std::rint
ausgelöst werden, wenn ein endlicher Nicht-Ganzzahl-Wert gerundet wird.
Der einzige Unterschied zwischen
std::rint
und
std::nearbyint
ist, dass
std::nearbyint
niemals
FE_INEXACT
auslöst.
Die größten darstellbaren Fließkommawerte sind exakte Ganzzahlen in allen Standard-Fließkommaformaten, daher
std::rint
überläuft niemals allein; jedoch kann das Ergebnis jeden Ganzzahltyp (einschließlich
std::intmax_t
) überlaufen, wenn es in einer Ganzzahlvariable gespeichert wird.
Wenn der aktuelle Rundungsmodus ist:
-
FE_DOWNWARD
, dann entspricht
std::rintder Funktion std::floor . -
FE_UPWARD
, dann entspricht
std::rintder Funktion std::ceil . -
FE_TOWARDZERO
, dann entspricht
std::rintder Funktion std::trunc . -
FE_TONEAREST
, dann unterscheidet sich
std::rintvon std::round dadurch, dass Halbwegsfälle zur nächsten geraden Zahl statt von null weg gerundet werden.
Die zusätzlichen Überladungen müssen nicht exakt wie (A-C) bereitgestellt werden. Sie müssen lediglich ausreichen, um sicherzustellen, dass für ihr Argument num vom Ganzzahltyp:
- std :: rint ( num ) hat denselben Effekt wie std :: rint ( static_cast < double > ( num ) ) .
- std :: lrint ( num ) hat denselben Effekt wie std :: lrint ( static_cast < double > ( num ) ) .
- std :: llrint ( num ) hat denselben Effekt wie std :: llrint ( static_cast < double > ( num ) ) .
Beispiel
#include <cfenv> #include <climits> #include <cmath> #include <iostream> // #pragma STDC FENV_ACCESS ON int main() { std::fesetround(FE_TONEAREST); std::cout << "Runden auf die nächste Ganzzahl (bei .5 zur nächsten geraden Zahl):\n" << " rint(+2.3) = " << std::rint(2.3) << '\n' << " rint(+2.5) = " << std::rint(2.5) << '\n' << " rint(+3.5) = " << std::rint(3.5) << '\n' << " rint(-2.3) = " << std::rint(-2.3) << '\n' << " rint(-2.5) = " << std::rint(-2.5) << '\n' << " rint(-3.5) = " << std::rint(-3.5) << '\n'; std::fesetround(FE_DOWNWARD); std::cout << "Abrunden:\n" << " rint(+2.3) = " << std::rint(2.3) << '\n' << " rint(+2.5) = " << std::rint(2.5) << '\n' << " rint(+3.5) = " << std::rint(3.5) << '\n' << " rint(-2.3) = " << std::rint(-2.3) << '\n' << " rint(-2.5) = " << std::rint(-2.5) << '\n' << " rint(-3.5) = " << std::rint(-3.5) << '\n' << "Abrunden mit lrint:\n" << " lrint(+2.3) = " << std::lrint(2.3) << '\n' << " lrint(+2.5) = " << std::lrint(2.5) << '\n' << " lrint(+3.5) = " << std::lrint(3.5) << '\n' << " lrint(-2.3) = " << std::lrint(-2.3) << '\n' << " lrint(-2.5) = " << std::lrint(-2.5) << '\n' << " lrint(-3.5) = " << std::lrint(-3.5) << '\n' << "Spezielle Werte:\n" << " lrint(-0.0) = " << std::lrint(-0.0) << '\n' << std::hex << std::showbase << " lrint(-Inf) = " << std::lrint(-INFINITY) << '\n'; // Fehlerbehandlung std::feclearexcept(FE_ALL_EXCEPT); std::cout << "std::rint(0.1) = " << std::rint(.1) << '\n'; if (std::fetestexcept(FE_INEXACT)) std::cout << " FE_INEXACT wurde ausgelöst\n"; std::feclearexcept(FE_ALL_EXCEPT); std::cout << "std::lrint(LONG_MIN-2048.0) = " << std::lrint(LONG_MIN - 2048.0) << '\n'; if (std::fetestexcept(FE_INVALID)) std::cout << " FE_INVALID wurde ausgelöst\n"; }
Mögliche Ausgabe:
Runden zur nächsten Ganzzahl (Halbfälle zur geraden Zahl): rint(+2.3) = 2 rint(+2.5) = 2 rint(+3.5) = 4 rint(-2.3) = -2 rint(-2.5) = -2 rint(-3.5) = -4 Abrunden: rint(+2.3) = 2 rint(+2.5) = 2 rint(+3.5) = 4 rint(-2.3) = -2 rint(-2.5) = -2 rint(-3.5) = -4 Abrunden mit lrint: lrint(+2.3) = 2 lrint(+2.5) = 2 lrint(+3.5) = 3 lrint(-2.3) = -3 lrint(-2.5) = -3 lrint(-3.5) = -4 Spezielle Werte: lrint(-0.0) = 0 lrint(-Inf) = 0x8000000000000000 std::rint(0.1) = 0 std::lrint(LONG_MIN-2048.0) = 0x8000000000000000 FE_INVALID wurde ausgelöst
Siehe auch
|
(C++11)
(C++11)
(C++11)
|
nächstliegende Ganzzahl, die nicht größer im Betrag als der gegebene Wert ist
(Funktion) |
|
(C++11)
(C++11)
(C++11)
|
nächstliegende Ganzzahl unter Verwendung des aktuellen Rundungsmodus
(Funktion) |
|
(C++11)
(C++11)
|
ermittelt oder setzt Rundungsrichtung
(Funktion) |
|
C-Dokumentation
für
rint
|
|