Namespaces
Variants

remquo, remquof, remquol

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
remquo
(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
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 remquof ( float x, float y, int * quo ) ;
(1) (depuis C99)
double remquo ( double x, double y, int * quo ) ;
(2) (depuis C99)
long double remquol ( long double x, long double y, int * quo ) ;
(3) (depuis C99)
Défini dans l'en-tête <tgmath.h>
#define remquo( x, y, quo )
(4) (depuis C99)
1-3) Calcule le reste en virgule flottante de l'opération de division x / y comme le fait la fonction remainder() . De plus, le signe et au moins les trois derniers bits de x / y seront stockés dans quo , suffisants pour déterminer l'octant du résultat dans une période.
4) Macro générique de type : Si un argument non pointeur a le type long double , remquol est appelé. Sinon, si un argument non pointeur a un type entier ou le type double , remquo est appelé. Sinon, remquof est appelé.

Table des matières

Paramètres

x, y - valeurs à virgule flottante
quo - pointeur vers une valeur entière pour stocker le signe et certains bits de x / y

Valeur de retour

En cas de succès, retourne le reste en virgule flottante de la division x / y tel que défini dans remainder , et stocke, dans * quo , le signe et au moins trois des bits de poids faible de x / y (formellement, stocke une valeur dont le signe est le signe de x / y et dont la magnitude est congruente modulo 2 n
à la magnitude du quotient intégral de x / y , où n est un entier défini par l'implémentation supérieur ou égal à 3 ).

Si y est nul, la valeur stockée dans * quo n'est pas spécifiée.

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 renvoyé si les nombres sous-normaux sont pris en charge.

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é
  • Si x est ±∞ et y n'est pas NaN, NaN est retourné et FE_INVALID est déclenché
  • Si y est ±0 et x n'est pas NaN, NaN est retourné et FE_INVALID est déclenché
  • Si x ou y est NaN, NaN est retourné

Notes

POSIX exige qu'une erreur de domaine se produise si x est infini ou si y est nul.

Cette fonction est utile lors de l'implémentation de fonctions périodiques avec une période exactement représentable comme valeur à virgule flottante : lors du calcul de sin(πx) pour un x très grand, l'appel direct à sin peut entraîner une erreur importante, mais si l'argument de la fonction est d'abord réduit avec remquo , les bits de poids faible du quotient peuvent être utilisés pour déterminer le signe et l'octant du résultat dans la période, tandis que le reste peut être utilisé pour calculer la valeur avec une haute précision.

Sur certaines plateformes, cette opération est prise en charge par le matériel (et, par exemple, sur un processeur Intel, FPREM1 laisse exactement 3 bits de précision dans le quotient).

Exemple

#include <fenv.h>
#include <math.h>
#include <stdio.h>
#ifndef __GNUC__
#pragma STDC FENV_ACCESS ON
#endif
double cos_pi_x_naive(double x)
{
    const double pi = acos(-1);
    return cos(pi * x);
}
// la période est 2, les valeurs sont (0;0.5) positives, (0.5;1.5) négatives, (1.5,2) positives
double cos_pi_x_smart(double x)
{
    const double pi = acos(-1);
    int extremum;
    double rem = remquo(x, 1, &extremum);
    extremum = (unsigned)extremum % 2; // garder 1 bit pour déterminer l'extremum le plus proche
    return extremum ? -cos(pi * rem) : cos(pi * rem);
}
int main(void)
{
    printf("cos(pi * 0.25) = %f\n", cos_pi_x_naive(0.25));
    printf("cos(pi * 1.25) = %f\n", cos_pi_x_naive(1.25));
    printf("cos(pi * 1000000000000.25) = %f\n", cos_pi_x_naive(1000000000000.25));
    printf("cos(pi * 1000000000001.25) = %f\n", cos_pi_x_naive(1000000000001.25));
    printf("cos(pi * 1000000000000.25) = %f\n", cos_pi_x_smart(1000000000000.25));
    printf("cos(pi * 1000000000001.25) = %f\n", cos_pi_x_smart(1000000000001.25));
    // gestion des erreurs
    feclearexcept(FE_ALL_EXCEPT);
    int quo;
    printf("remquo(+Inf, 1) = %.1f\n", remquo(INFINITY, 1, &quo));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID raised");
}

Sortie possible :

cos(pi * 0.25) = 0.707107
cos(pi * 1.25) = -0.707107
cos(pi * 1000000000000.25) = 0.707123
cos(pi * 1000000000001.25) = -0.707117
cos(pi * 1000000000000.25) = 0.707107
cos(pi * 1000000000001.25) = -0.707107 
remquo(+Inf, 1) = -nan
    FE_INVALID raised

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.12.10.3 Les fonctions remquo (p: TBD)
  • 7.25 Mathématiques génériques <tgmath.h> (p: TBD)
  • F.10.7.3 Les fonctions remquo (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.12.10.3 Les fonctions remquo (p: 186)
  • 7.25 Mathématiques génériques de type <tgmath.h> (p: 272-273)
  • F.10.7.3 Les fonctions remquo (p: 385)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.12.10.3 Les fonctions remquo (p: 255)
  • 7.25 Mathématiques génériques <tgmath.h> (p: 373-375)
  • F.10.7.3 Les fonctions remquo (p: 529)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.12.10.3 Les fonctions remquo (p: 236)
  • 7.22 Mathématiques génériques de type <tgmath.h> (p: 335-337)
  • F.9.7.3 Les fonctions remquo (p: 465)

Voir aussi

calcule le quotient et le reste d'une division entière
(fonction)
(C99) (C99)
calcule le reste de l'opération de division en virgule flottante
(fonction)
calcule le reste signé de l'opération de division en virgule flottante
(fonction)