Namespaces
Variants

std:: rint, std:: rintf, std:: rintl, std:: lrint, std:: lrintf, std:: lrintl, std:: llrint, std:: llrintf

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
rint lrint llrint
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
Défini dans l'en-tête <cmath>
Arrondi vers les types à virgule flottante
(1)
float rint ( float num ) ;

double rint ( double num ) ;

long double rint ( long double num ) ;
(depuis C++11)
(jusqu'à C++23)
/* floating-point-type */ rint ( /* floating-point-type */ num ) ;
(depuis C++23)
float rintf ( float num ) ;
(2) (depuis C++11)
long double rintl ( long double num ) ;
(3) (depuis C++11)
Arrondi vers long
(4)
long lrint ( float num ) ;

long lrint ( double num ) ;

long lrint ( long double num ) ;
(depuis C++11)
(jusqu'à C++23)
long lrint ( /* floating-point-type */ num ) ;
(depuis C++23)
long lrintf ( float num ) ;
(5) (depuis C++11)
long lrintl ( long double num ) ;
(6) (depuis C++11)
Arrondi vers long long
(7)
long long llrint ( float num ) ;

long long llrint ( double num ) ;

long long llrint ( long double num ) ;
(depuis C++11)
(jusqu'à C++23)
long long llrint ( /* floating-point-type */ num ) ;
(depuis C++23)
long long llrintf ( float num ) ;
(8) (depuis C++11)
long long llrintl ( long double num ) ;
(9) (depuis C++11)
Défini dans l'en-tête <cmath>
template < class Integer >
double rint ( Integer num ) ;
(A) (depuis C++11)
template < class Integer >
long lrint ( Integer num ) ;
(B) (depuis C++11)
template < class Integer >
long long llrint ( Integer num ) ;
(C) (depuis C++11)
1-3) Arrondit l'argument à virgule flottante num à une valeur entière (au format virgule flottante), en utilisant le mode d'arrondi courant . La bibliothèque fournit des surcharges de std::rint pour tous les types à virgule flottante non qualifiés cv comme type du paramètre num . (depuis C++23)
4-9) Arrondit l'argument à virgule flottante num à une valeur entière, en utilisant le mode d'arrondi courant . La bibliothèque fournit des surcharges de std::lrint et std::llrint pour tous les types à virgule flottante non qualifiés cv comme type du paramètre num . (depuis C++23)
A-C) Des surcharges supplémentaires sont fournies pour tous les types entiers, qui sont traités comme double .

Table des matières

Paramètres

num - valeur à virgule flottante ou entière

Valeur de retour

Si aucune erreur ne se produit, la valeur entière la plus proche de num , selon le mode d'arrondi actuel , est retournée.

Gestion des erreurs

Les erreurs sont signalées comme spécifié dans math_errhandling .

Si le résultat de std::lrint ou std::llrint est en dehors de la plage représentable par le type de retour, une erreur de domaine ou une erreur de plage peut survenir.

Si l'implémentation prend en charge l'arithmétique à virgule flottante IEEE (IEC 60559),

Pour la fonction std::rint :
  • Si num est ±∞, il est retourné, non modifié.
  • Si num est ±0, il est retourné, non modifié.
  • Si num est NaN, NaN est retourné.
Pour les fonctions std::lrint et std::llrint :
  • Si num est ±∞, FE_INVALID est déclenché et une valeur définie par l'implémentation est retournée.
  • Si le résultat de l'arrondi est en dehors de la plage du type de retour, FE_INVALID est déclenché et une valeur définie par l'implémentation est retournée.
  • Si num est NaN, FE_INVALID est déclenché et une valeur définie par l'implémentation est retournée.

Notes

POSIX spécifie que tous les cas où std::lrint ou std::llrint lèvent FE_INEXACT sont des erreurs de domaine.

Comme spécifié dans math_errhandling , FE_INEXACT peut être (mais n'est pas requis sur les plateformes à virgule flottante non-IEEE) déclenché par std::rint lors de l'arrondi d'une valeur finie non entière.

La seule différence entre std::rint et std::nearbyint est que std::nearbyint ne lève jamais FE_INEXACT .

Les plus grandes valeurs représentables en virgule flottante sont des entiers exacts dans tous les formats standard de virgule flottante, donc std::rint ne provoque jamais de dépassement de capacité par lui-même ; cependant le résultat peut dépasser la capacité de tout type entier (y compris std::intmax_t ), lorsqu'il est stocké dans une variable entière.

Si le mode d'arrondi actuel est :

Les surcharges supplémentaires ne sont pas obligées d'être fournies exactement comme (A-C) . Elles doivent seulement être suffisantes pour garantir que pour leur argument num de type entier :

  • std :: rint ( num ) a le même effet que std :: rint ( static_cast < double > ( num ) ) .
  • std :: lrint ( num ) a le même effet que std :: lrint ( static_cast < double > ( num ) ) .
  • std :: llrint ( num ) a le même effet que std :: llrint ( static_cast < double > ( num ) ) .

Exemple

#include <cfenv>
#include <climits>
#include <cmath>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
int main()
{
    std::fesetround(FE_TONEAREST);
    std::cout << "Arrondi au plus proche (cas à mi-chemin vers le pair) :\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 << "Arrondi vers le bas :\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'
              << "Arrondi vers le bas avec 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'
              << "Valeurs spéciales :\n"
              << "  lrint(-0.0) = " << std::lrint(-0.0) << '\n'
              << std::hex << std::showbase
              << "  lrint(-Inf) = " << std::lrint(-INFINITY) << '\n';
    // gestion des erreurs
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "std::rint(0.1) = " << std::rint(.1) << '\n';
    if (std::fetestexcept(FE_INEXACT))
        std::cout << "  FE_INEXACT a été déclenché\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 a été déclenché\n";
}

Sortie possible :

Arrondi au plus proche (cas médians vers l'égalité) :
  rint(+2.3) = 2
  rint(+2.5) = 2
  rint(+3.5) = 4
  rint(-2.3) = -2
  rint(-2.5) = -2
  rint(-3.5) = -4
Arrondi vers le bas :
  rint(+2.3) = 2
  rint(+2.5) = 2
  rint(+3.5) = 4
  rint(-2.3) = -2
  rint(-2.5) = -2
  rint(-3.5) = -4
Arrondi vers le bas avec 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
Valeurs spéciales :
  lrint(-0.0) = 0
  lrint(-Inf) = 0x8000000000000000
std::rint(0.1) = 0
std::lrint(LONG_MIN-2048.0) = 0x8000000000000000
  FE_INVALID a été déclenchée

Voir aussi

(C++11) (C++11) (C++11)
entier le plus proche en magnitude inférieure ou égale à la valeur donnée
(fonction)
(C++11) (C++11) (C++11)
entier le plus proche utilisant le mode d'arrondi actuel
(fonction)
(C++11) (C++11)
obtient ou définit la direction d'arrondi
(fonction)