Namespaces
Variants

nextafter, nextafterf, nextafterl, nexttoward, nexttowardf, nexttowardl

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
nextafter nexttoward
(C99) (C99)
(C23) (C23)
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
Error handling
Fast operation indicators
Défini dans l'en-tête <math.h>
float nextafterf ( float from, float to ) ;
(1) (depuis C99)
double nextafter ( double from, double to ) ;
(2) (depuis C99)
long double nextafterl ( long double from, long double to ) ;
(3) (depuis C99)
float nexttowardf ( float from, long double to ) ;
(4) (depuis C99)
double nexttoward ( double from, long double to ) ;
(5) (depuis C99)
long double nexttowardl ( long double from, long double to ) ;
(6) (depuis C99)
Défini dans l'en-tête <tgmath.h>
#define nextafter(from, to)
(7) (depuis C99)
#define nexttoward(from, to)
(8) (depuis C99)
1-3) Convertit d'abord les deux arguments en le type de la fonction, puis retourne la prochaine valeur représentable de from en direction de to . Si from est égal à to , to est retourné.
4-6) Convertit d'abord le premier argument en type de la fonction, puis retourne la valeur représentable suivante de from dans la direction de to . Si from est égal à to , to est retourné, converti de long double vers le type de retour de la fonction sans perte de plage ou de précision.
7) Macro générique de type : Si un argument a le type long double , nextafterl est appelé. Sinon, si un argument a un type entier ou le type double , nextafter est appelé. Sinon, nextafterf est appelé.
8) Macro générique de type : Si l'argument from a le type long double , nexttowardl est appelé. Sinon, si from a un type entier ou le type double , nexttoward est appelé. Sinon, nexttowardf est appelé.

Table des matières

Paramètres

de, à - valeurs à virgule flottante

Valeur de retour

Si aucune erreur ne se produit, la valeur représentable suivante de from dans la direction de to est retournée. Si from est égal à to , alors to est retourné, converti au type de la fonction.

Si une erreur de plage due à un dépassement de capacité se produit, ± HUGE_VAL , ±HUGE_VALF , ou ±HUGE_VALL est retourné (avec le même signe que from ).

Si une erreur de plage se produit en raison d'un dépassement inférieur, le résultat correct est retourné.

Gestion des erreurs

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

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

  • si from est fini, mais que le résultat attendu est un infini, lève FE_INEXACT et FE_OVERFLOW .
  • si from n'est pas égal à to et que le résultat est sous-normal ou zéro, lève FE_INEXACT et FE_UNDERFLOW .
  • dans tous les cas, la valeur retournée est indépendante du mode d'arrondi actuel
  • si from ou to est NaN, NaN est retourné.

Notes

POSIX spécifie que les conditions de dépassement supérieur et de dépassement inférieur sont des erreurs de plage ( errno peut être défini).

La norme IEC 60559 recommande que from soit retourné lorsque from == to . Ces fonctions retournent to à la place, ce qui rend le comportement autour de zéro cohérent : nextafter(-0.0, +0.0) retourne + 0.0 et nextafter(+0.0, -0.0) retourne - 0.0 .

nextafter est généralement implémenté par manipulation de la représentation IEEE ( glibc musl ).

Exemple

#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
int main(void)
{
    float from1 = 0, to1 = nextafterf(from1, 1);
    printf("Le prochain flottant représentable après %.2f est %.20g (%a)\n", from1, to1, to1);
    float from2 = 1, to2 = nextafterf(from2, 2);
    printf("Le prochain flottant représentable après %.2f est %.20f (%a)\n", from2, to2, to2);
    double from3 = nextafter(0.1, 0), to3 = 0.1;
    printf("Le nombre 0.1 se situe entre deux doubles valides :\n"
           "    %.56f (%a)\net %.55f  (%a)\n", from3, from3, to3, to3);
    // différence entre nextafter et nexttoward :
    long double dir = nextafterl(from1, 1); // premier long double subnormal
    float x = nextafterf(from1, dir); // convertit d'abord dir en float, donnant 0
    printf("En utilisant nextafter, le prochain flottant après %.2f (%a) est %.20g (%a)\n",
           from1, from1, x, x);
    x = nexttowardf(from1, dir);
    printf("En utilisant nexttoward, le prochain flottant après %.2f (%a) est %.20g (%a)\n",
           from1, from1, x, x);
    // valeurs spéciales
    {
        #pragma STDC FENV_ACCESS ON
        feclearexcept(FE_ALL_EXCEPT);
        double from4 = DBL_MAX, to4 = nextafter(from4, INFINITY);
        printf("Le prochain double représentable après %.2g (%a) est %.23f (%a)\n",
               from4, from4, to4, to4);
        if(fetestexcept(FE_OVERFLOW)) puts("   a déclenché FE_OVERFLOW");
        if(fetestexcept(FE_INEXACT)) puts("   a déclenché FE_INEXACT");
    } // fin du bloc FENV_ACCESS
    float from5 = 0.0, to5 = nextafter(from5, -0.0);
    printf("nextafter(+0.0, -0.0) donne %.2g (%a)\n", to5, to5);
}

Sortie :

Le prochain flottant représentable après 0.00 est 1.4012984643248170709e-45 (0x1p-149)
Le prochain flottant représentable après 1.00 est 1.00000011920928955078 (0x1.000002p+0)
Le nombre 0.1 se situe entre deux doubles valides :
    0.09999999999999999167332731531132594682276248931884765625 (0x1.9999999999999p-4)
et 0.1000000000000000055511151231257827021181583404541015625  (0x1.999999999999ap-4)
En utilisant nextafter, le prochain flottant après 0.00 (0x0p+0) est 0 (0x0p+0)
En utilisant nexttoward, le prochain flottant après 0.00 (0x0p+0) est 1.4012984643248170709e-45 (0x1p-149)
Le prochain double représentable après 1.8e+308 (0x1.fffffffffffffp+1023) est inf (inf)
   a déclenché FE_OVERFLOW
   a déclenché FE_INEXACT
nextafter(+0.0, -0.0) donne -0 (-0x0p+0)

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.12.11.3 Les fonctions nextafter (p: TBD)
  • 7.12.11.4 Les fonctions nexttoward (p: TBD)
  • 7.25 Mathématiques génériques de type <tgmath.h> (p: TBD)
  • F.10.8.3 Les fonctions nextafter (p: TBD)
  • F.10.8.4 Les fonctions nexttoward (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.12.11.3 Les fonctions nextafter (p: 187)
  • 7.12.11.4 Les fonctions nexttoward (p: 187)
  • 7.25 Mathématiques génériques de type <tgmath.h> (p: 272-273)
  • F.10.8.3 Les fonctions nextafter (p: 386)
  • F.10.8.4 Les fonctions nexttoward (p: 386)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.12.11.3 Les fonctions nextafter (p: 256)
  • 7.12.11.4 Les fonctions nexttoward (p: 257)
  • 7.25 Mathématiques génériques de type <tgmath.h> (p: 373-375)
  • F.10.8.3 Les fonctions nextafter (p: 529)
  • F.10.8.4 Les fonctions nexttoward (p: 529)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.12.11.3 Les fonctions nextafter (p: 237)
  • 7.12.11.4 Les fonctions nexttoward (p: 238)
  • 7.22 Mathématiques génériques de type <tgmath.h> (p: 335-337)
  • F.9.8.3 Les fonctions nextafter (p: 466)
  • F.9.8.4 Les fonctions nexttoward (p: 466)

Voir aussi

Documentation C++ pour nextafter