Definito nell'intestazione
floatremquof(float x,float y,int*quo );
(1) (dal C99)
doubleremquo(double x,double y,int*quo );
(2) (dal C99)
longdoubleremquol(longdouble x,longdouble y,int*quo );
(3) (dal C99)
Definito nell'intestazione
#defineremquo( x, y, quo )
(4) (dal C99)

1-3) Calcola il resto in virgola mobile dell'operazione di divisione x/y come il valore remainder() . Inoltre, il segno e almeno i tre ultimi bit di x/y saranno memorizzati in quo, sufficienti per determinare l'ottante del risultato all'interno di un periodo.4) Macro generica di tipo: Se un argomento non puntatore ha il tipo long double, remquol viene chiamata. Altrimenti, se qualsiasi argomento non puntatore ha un tipo intero o ha un tipo double, remquo viene richiamato. Altrimenti, remquof viene richiamato.

Parametri

x, y - valori in virgola mobile
quo - puntatore a un valore intero per memorizzare il segno e alcuni bit di x/y

Valore di ritorno

In caso di successo, restituisce il resto in virgola mobile della divisione x/y come definito in remaindere memorizza, in *quoil segno e almeno tre dei bit meno significativi di x/y (formalmente, memorizza un valore il cui segno è il segno di x/y e la cui grandezza è congruente modulo 2 n
alla grandezza dell'integrale quoziente di x/ydove n è un intero maggiore o uguale a 3 definito dall'implementazione).

Se y è zero, il valore memorizzato in *quo non è specificato.

Se si verifica un errore di dominio, viene restituito un valore definito dall'implementazione (NaN se supportato).

Se si verifica un errore di intervallo dovuto a underflow, viene restituito il risultato corretto se sono supportate le subnormali.

Se y è zero, ma non si verifica l'errore di dominio, viene restituito zero.

Gestione degli errori

Gli errori vengono segnalati come specificato in math_errhandling.

L'errore di dominio può verificarsi se y è zero.

Se l'implementazione supporta l'aritmetica in virgola mobile IEEE (IEC 60559),

  • La modalità di arrotondamento corrente non ha alcun effetto.
  • FE_INEXACT non viene mai sollevato
  • Se x è ±∞ e y non è NaN, viene restituito NaN e FE_INVALID viene sollevato
  • Se y è ±0 e x non è NaN, viene restituito NaN e FE_INVALID viene sollevato
  • Se x o y è NaN, viene restituito NaN

Note

POSIX richiede che si verifichi un errore di dominio se x è infinito o y è zero.

Questa funzione è utile quando si implementano funzioni periodiche con il periodo esattamente rappresentabile come un valore in virgola mobile: quando si calcola sin(πx) per un valore molto grande x, chiamando sin può dare luogo a un errore di grandi dimensioni, ma se l'argomento della funzione viene prima ridotto con remquoi bit di ordine inferiore del quoziente possono essere utilizzati per determinare il segno e l'ottante del risultato all'interno del periodo, mentre il resto può essere utilizzato per calcolare il valore con alta precisione.

Su alcune piattaforme questa operazione è supportata dall'hardware (ad esempio, sulle CPU Intel), FPREM1 lascia esattamente 3 bit di precisione nel quoziente).

Esempio

#include#include#include#pragmaSTDC FENV_ACCESS ONdoublecos_pi_x_naive(double x){double pi =acos(-1);returncos(pi * x);}// the period is 2, values are (0;0.5) positive, (0.5;1.5) negative, (1.5,2) positivedoublecos_pi_x_smart(double x){int quadrant;double rem =remquo(x,1,&quadrant);
    quadrant =(unsigned)quadrant %4;// keep 2 bits to determine quadrantdouble pi =acos(-1);switch(quadrant){case0:returncos(pi * rem);case1:return-cos(pi * rem);case2:return-cos(pi * rem);case3:returncos(pi * rem);};}intmain(void){printf("cos(pi * 0.25) = %fn",cos_pi_x_naive(0.25));printf("cos(pi * 1.25) = %fn",cos_pi_x_naive(1.25));printf("cos(pi * 1000000000000.25) = %fn",cos_pi_x_naive(1000000000000.25));printf("cos(pi * 1000000000001.25) = %fn",cos_pi_x_naive(1000000000001.25));printf("cos(pi * 1000000000000.25) = %fn",cos_pi_x_smart(1000000000000.25));printf("cos(pi * 1000000000001.25) = %fn",cos_pi_x_smart(1000000000001.25));// error handlingfeclearexcept(FE_ALL_EXCEPT);int quo;printf("remquo(+Inf, 1) = %.1fn",remquo(INFINITY,1,&quo));if(fetestexcept(FE_INVALID))puts("    FE_INVALID raised");}

Possibile uscita:

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

Riferimenti

  • Norma C11 (ISO/IEC 9899:2011):
    • 7.12.10.3 Le funzioni remquo (p: 255)
    • 7.25 Matematica generica dei tipi (p: 373-375)
    • F.10.7.3 Le funzioni remquo (p: 529)
  • Standard C99 (ISO/IEC 9899:1999):
    • 7.12.10.3 Le funzioni remquo (p: 236)
    • 7.22 Matematica generica dei tipi (p: 335-337)
    • F.9.7.3 Le funzioni remquo (p: 465)

Si veda anche

divldivlldiv(C99) calcola il quoziente e il resto di una divisione intera
(funzione)
fmodfmodffmodl(C99)(C99) calcola il resto dell'operazione di divisione in virgola mobile
(funzione)
restorestofrestol(C99)(C99)(C99) calcola il resto firmato dell'operazione di divisione in virgola mobile
(funzione)