std:: remainder, std:: remainderf, std:: remainderl
|
Défini dans l'en-tête
<cmath>
|
||
| (1) | ||
|
float
remainder
(
float
x,
float
y
)
;
double
remainder
(
double
x,
double
y
)
;
|
(jusqu'à C++23) | |
|
constexpr
/*floating-point-type*/
remainder
(
/*floating-point-type*/
x,
|
(depuis C++23) | |
|
float
remainderf
(
float
x,
float
y
)
;
|
(2) |
(depuis C++11)
(constexpr depuis C++23) |
|
long
double
remainderl
(
long
double
x,
long
double
y
)
;
|
(3) |
(depuis C++11)
(constexpr depuis C++23) |
|
Surcharge SIMD
(depuis C++26)
|
||
|
Défini dans l'en-tête
<simd>
|
||
|
template
<
class
V0,
class
V1
>
constexpr
/*math-common-simd-t*/
<
V0, V1
>
|
(S) | (depuis C++26) |
|
Surcharges supplémentaires
(depuis C++11)
|
||
|
Défini dans l'en-tête
<cmath>
|
||
|
template
<
class
Integer
>
double remainder ( Integer x, Integer y ) ; |
(A) | (constexpr depuis C++23) |
std::remainder
pour tous les types en virgule flottante non qualifiés cv comme type des paramètres.
(depuis C++23)
|
S)
La surcharge SIMD effectue un
std::remainder
élément par élément sur
v_x
et
v_y
.
|
(depuis C++26) |
|
A)
Des surcharges supplémentaires sont fournies pour tous les types entiers, qui sont traités comme
double
.
|
(depuis C++11) |
Le reste en virgule flottante IEEE de l'opération de division x / y calculé par cette fonction est exactement la valeur x - quo * y , où la valeur quo est la valeur intégrale la plus proche de la valeur exacte x / y . Lorsque |quo - x / y| = ½ , la valeur quo est choisie paire.
Contrairement à std::fmod , la valeur retournée n'est pas garantie d'avoir le même signe que x .
Si la valeur retournée est zéro, elle aura le même signe que x .
Table des matières |
Paramètres
| x, y | - | valeurs à virgule flottante ou entières |
Valeur de retour
En cas de succès, retourne le reste en virgule flottante IEEE de la division x / y tel que défini ci-dessus.
Si une erreur de domaine se produit, une valeur définie par l'implémentation est retournée (NaN là où supporté).
Si une erreur de plage se produit en raison d'un dépassement inférieur, le résultat correct est retourné.
Si y est nul, mais que l'erreur de domaine ne se produit pas, zéro est retourné.
Gestion des erreurs
Les erreurs sont signalées comme spécifié dans math_errhandling .
Une erreur de domaine peut survenir si y est nul.
Si l'implémentation prend en charge l'arithmétique à virgule flottante IEEE (IEC 60559),
- Le mode d'arrondi actuel n'a aucun effet.
- FE_INEXACT n'est jamais déclenchée, le résultat est toujours exact.
- Si x est ±∞ et y n'est pas NaN, NaN est retourné et FE_INVALID est déclenchée.
- Si y est ±0 et x n'est pas NaN, NaN est retourné et FE_INVALID est déclenchée.
- Si l'un des arguments est NaN, NaN est retourné.
Notes
POSIX exige qu'une erreur de domaine se produise si x est infini ou si y est zéro.
std::fmod
, mais pas
std::remainder
, est utile pour effectuer un enroulement silencieux des types à virgule flottante vers les types entiers non signés :
(
0.0
<=
(
y
=
std::
fmod
(
std::
rint
(
x
)
,
65536.0
)
)
)
?
y
:
65536.0
+
y
est dans l'intervalle
[
-
0.0
,
65535.0
]
, ce qui correspond à
unsigned
short
, mais
std
::
remainder
(
std::
rint
(
x
)
,
65536.0
)
est dans l'intervalle
[
-
32767.0
,
+
32768.0
]
, ce qui est en dehors de l'intervalle de
signed
short
.
Les surcharges supplémentaires ne sont pas tenues d'être fournies exactement comme (A) . Elles doivent seulement être suffisantes pour garantir que pour leur premier argument num1 et second argument num2 :
|
(jusqu'en C++23) |
|
Si
num1
et
num2
ont des types arithmétiques, alors
std
::
remainder
(
num1, num2
)
a le même effet que
std
::
remainder
(
static_cast
<
/*common-floating-point-type*/
>
(
num1
)
,
Si aucun tel type à virgule flottante avec le plus grand rang et la plus grande sous-catégorie n'existe, alors la résolution de surcharge ne résulte pas en un candidat utilisable parmi les surcharges fournies. |
(depuis C++23) |
Exemple
#include <cfenv> #include <cmath> #include <iostream> // #pragma STDC FENV_ACCESS ON int main() { std::cout << "remainder(+5.1, +3.0) = " << std::remainder(5.1, 3) << '\n' << "remainder(-5.1, +3.0) = " << std::remainder(-5.1, 3) << '\n' << "remainder(+5.1, -3.0) = " << std::remainder(5.1, -3) << '\n' << "remainder(-5.1, -3.0) = " << std::remainder(-5.1, -3) << '\n'; // valeurs spéciales std::cout << "remainder(-0.0, 1.0) = " << std::remainder(-0.0, 1) << '\n' << "remainder(5.1, Inf) = " << std::remainder(5.1, INFINITY) << '\n'; // gestion des erreurs std::feclearexcept(FE_ALL_EXCEPT); std::cout << "remainder(+5.1, 0) = " << std::remainder(5.1, 0) << '\n'; if (fetestexcept(FE_INVALID)) std::cout << " FE_INVALID levée\n"; }
Sortie possible :
remainder(+5.1, +3.0) = -0.9
remainder(-5.1, +3.0) = 0.9
remainder(+5.1, -3.0) = -0.9
remainder(-5.1, -3.0) = 0.9
remainder(-0.0, 1.0) = -0
remainder(5.1, Inf) = 5.1
remainder(+5.1, 0) = -nan
FE_INVALID levée
Voir aussi
|
(C++11)
|
calcule le quotient et le reste de la division entière
(fonction) |
|
(C++11)
(C++11)
|
reste de l'opération de division en virgule flottante
(fonction) |
|
(C++11)
(C++11)
(C++11)
|
reste signé ainsi que les trois derniers bits de l'opération de division
(fonction) |
|
Documentation C
pour
remainder
|
|