std:: fmod, std:: fmodf, std:: fmodl
|
Definiert in Header
<cmath>
|
||
| (1) | ||
|
float
fmod
(
float
x,
float
y
)
;
double
fmod
(
double
x,
double
y
)
;
|
(bis C++23) | |
|
constexpr
/*floating-point-type*/
fmod
(
/*floating-point-type*/
x,
|
(seit C++23) | |
|
float
fmodf
(
float
x,
float
y
)
;
|
(2) |
(seit C++11)
(constexpr seit C++23) |
|
long
double
fmodl
(
long
double
x,
long
double
y
)
;
|
(3) |
(seit C++11)
(constexpr seit C++23) |
|
SIMD-Überladung
(seit C++26)
|
||
|
Definiert in Header
<simd>
|
||
|
template
<
class
V0,
class
V1
>
constexpr
/*math-common-simd-t*/
<
V0, V1
>
|
(S) | (seit C++26) |
|
Zusätzliche Überladungen
(seit C++11)
|
||
|
Definiert in Header
<cmath>
|
||
|
template
<
class
Integer
>
double fmod ( Integer x, Integer y ) ; |
(A) | (constexpr seit C++23) |
std::fmod
für alle cv-unqualifizierten Gleitkommatypen als Parametertyp bereit.
(since C++23)
|
S)
Die SIMD-Überladung führt eine elementweise
std::fmod
-Operation auf
v_x
und
v_y
durch.
|
(seit C++26) |
|
A)
Zusätzliche Überladungen werden für alle Ganzzahltypen bereitgestellt, die als
double
behandelt werden.
|
(since C++11) |
Der Gleitkomma-Rest der Divisionsoperation x / y , der von dieser Funktion berechnet wird, ist exakt der Wert x - iquot * y , wobei iquot gleich x / y mit abgeschnittenem Nachkommaanteil ist.
Der zurückgegebene Wert hat dasselbe Vorzeichen wie x und ist im Betrag kleiner als y .
Inhaltsverzeichnis |
Parameter
| x, y | - | Gleitkomma- oder Ganzzahlwerte |
Rückgabewert
Bei Erfolg gibt es den Gleitkomma-Rest der Division x / y wie oben definiert zurück.
Wenn ein Domänenfehler auftritt, wird ein implementierungsdefinierter Wert zurückgegeben (NaN, sofern unterstützt).
Wenn ein Bereichsfehler aufgrund von Unterlauf auftritt, wird das korrekte Ergebnis (nach Rundung) zurückgegeben.
Fehlerbehandlung
Fehler werden gemeldet, wie in math_errhandling spezifiziert.
Ein Domänenfehler kann auftreten, wenn y null ist.
Wenn die Implementierung IEEE-Gleitkommaarithmetik (IEC 60559) unterstützt,
- Wenn x ±0 ist und y nicht null ist, wird ±0 zurückgegeben.
- Wenn x ±∞ ist und y nicht NaN ist, wird NaN zurückgegeben und FE_INVALID ausgelöst.
- Wenn y ±0 ist und x nicht NaN ist, wird NaN zurückgegeben und FE_INVALID ausgelöst.
- Wenn y ±∞ ist und x endlich ist, wird x zurückgegeben.
- Wenn eines der Argumente NaN ist, wird NaN zurückgegeben.
Hinweise
POSIX erfordert dass ein Domänenfehler auftritt, wenn x unendlich ist oder y null ist.
std::fmod
, aber nicht
std::remainder
ist nützlich für das stille Umwandeln von Gleitkommatypen in vorzeichenlose Ganzzahltypen:
(
0.0
<=
(
y
=
std
::
fmod
(
std::
rint
(
x
)
,
65536.0
)
)
?
y
:
65536.0
+
y
)
liegt im Bereich
[
-
0.0
,
65535.0
]
, was
unsigned
short
entspricht, aber
std::
remainder
(
std::
rint
(
x
)
,
65536.0
liegt im Bereich
[
-
32767.0
,
+
32768.0
]
, was außerhalb des Bereichs von
signed
short
liegt.
Die
double
-Version von
std::fmod
verhält sich, als wäre sie wie folgt implementiert:
double fmod(double x, double y) { #pragma STDC FENV_ACCESS ON double result = std::remainder(std::fabs(x), y = std::fabs(y)); if (std::signbit(result)) result += y; return std::copysign(result, x); }
Der Ausdruck x - std:: trunc ( x / y ) * y entspricht möglicherweise nicht std :: fmod ( x, y ) , wenn die Rundung von x / y zur Initialisierung des Arguments von std::trunc zu viel Präzision verliert (Beispiel: x = 30.508474576271183309 , y = 6.1016949152542370172 ).
Die zusätzlichen Überladungen müssen nicht exakt wie (A) bereitgestellt werden. Sie müssen lediglich sicherstellen, dass für ihr erstes Argument num1 und zweites Argument num2 :
|
(bis C++23) |
|
Falls
num1
und
num2
arithmetische Typen haben, dann hat
std
::
fmod
(
num1, num2
)
denselben Effekt wie
std
::
fmod
(
static_cast
<
/*common-floating-point-type*/
>
(
num1
)
,
Falls kein solcher Gleitkommatyp mit dem höchsten Rang und Unterrang existiert, dann führt die Überlagerungsauflösung nicht zu einem verwendbaren Kandidaten aus den bereitgestellten Überlagerungen. |
(seit C++23) |
Beispiel
#include <cfenv> #include <cmath> #include <iostream> // #pragma STDC FENV_ACCESS ON int main() { std::cout << "fmod(+5.1, +3.0) = " << std::fmod(5.1, 3) << '\n' << "fmod(-5.1, +3.0) = " << std::fmod(-5.1, 3) << '\n' << "fmod(+5.1, -3.0) = " << std::fmod(5.1, -3) << '\n' << "fmod(-5.1, -3.0) = " << std::fmod(-5.1, -3) << '\n'; // special values std::cout << "fmod(+0.0, 1.0) = " << std::fmod(0, 1) << '\n' << "fmod(-0.0, 1.0) = " << std::fmod(-0.0, 1) << '\n' << "fmod(5.1, Inf) = " << std::fmod(5.1, INFINITY) << '\n'; // error handling std::feclearexcept(FE_ALL_EXCEPT); std::cout << "fmod(+5.1, 0) = " << std::fmod(5.1, 0) << '\n'; if (std::fetestexcept(FE_INVALID)) std::cout << " FE_INVALID raised\n"; }
Mögliche Ausgabe:
fmod(+5.1, +3.0) = 2.1
fmod(-5.1, +3.0) = -2.1
fmod(+5.1, -3.0) = 2.1
fmod(-5.1, -3.0) = -2.1
fmod(+0.0, 1.0) = 0
fmod(-0.0, 1.0) = -0
fmod(5.1, Inf) = 5.1
fmod(+5.1, 0) = -nan
FE_INVALID raised
Siehe auch
|
(C++11)
|
berechnet Quotient und Rest der ganzzahligen Division
(Funktion) |
|
(C++11)
(C++11)
(C++11)
|
vorzeichenbehafteter Rest der Divisionsoperation
(Funktion) |
|
(C++11)
(C++11)
(C++11)
|
vorzeichenbehafteter Rest sowie die drei letzten Bits der Divisionsoperation
(Funktion) |
|
C-Dokumentation
für
fmod
|
|