Namespaces
Variants

fmod, fmodf, fmodl

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
fmod
(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
Definido en el encabezado <math.h>
float fmodf ( float x, float y ) ;
(1) (desde C99)
double fmod ( double x, double y ) ;
(2)
long double fmodl ( long double x, long double y ) ;
(3) (desde C99)
Definido en el encabezado <tgmath.h>
#define fmod( x, y )
(4) (desde C99)
1-3) Calcula el resto en punto flotante de la operación de división x / y .
4) Macro genérico de tipos: Si algún argumento tiene tipo long double , fmodl es llamado. De lo contrario, si algún argumento tiene tipo entero o tiene tipo double , fmod es llamado. De lo contrario, fmodf es llamado.

El resto en punto flotante de la operación de división x / y calculado por esta función es exactamente el valor x - n * y , donde n es x / y con su parte fraccionaria truncada.

El valor devuelto tiene el mismo signo que x y es menor o igual que y en magnitud.

Contenidos

Parámetros

x, y - valores de punto flotante

Valor de retorno

Si tiene éxito, devuelve el resto en punto flotante de la división x / y como se definió anteriormente.

Si ocurre un error de dominio, se devuelve un valor definido por la implementación (NaN donde esté soportado).

Si ocurre un error de rango debido a desbordamiento inferior, se devuelve el resultado correcto (después del redondeo).

Manejo de errores

Los errores se reportan como se especifica en math_errhandling .

Puede ocurrir un error de dominio si y es cero.

Si la implementación soporta aritmética de punto flotante IEEE (IEC 60559):

  • Si x es ±0 y y no es cero, se retorna ±0.
  • Si x es ±∞ y y no es NaN, se retorna NaN y se genera FE_INVALID .
  • Si y es ±0 y x no es NaN, se retorna NaN y se genera FE_INVALID .
  • Si y es ±∞ y x es finito, x es retornado.
  • Si cualquier argumento es NaN, se retorna NaN.

Notas

POSIX requiere que ocurra un error de dominio si x es infinito o y es cero.

fmod , pero no remainder es útil para realizar el ajuste silencioso de tipos de punto flotante a tipos enteros sin signo: ( 0.0 <= ( y = fmod ( rint ( x ) , 65536.0 ) ) ? y : 65536.0 + y ) está en el rango [ - 0.0 , 65535.0 ] , que corresponde a unsigned short , pero remainder ( rint ( x ) , 65536.0 ) está en el rango [ - 32767.0 , + 32768.0 ] , que está fuera del rango de signed short .

La versión double de fmod se comporta como si estuviera implementada de la siguiente manera:

double fmod(double x, double y)
{
#pragma STDC FENV_ACCESS ON
    double result = remainder(fabs(x), (y = fabs(y)));
    if (signbit(result))
        result += y;
    return copysign(result, x);
}

Ejemplo

#include <fenv.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON
int main(void)
{
    printf("fmod(+5.1, +3.0) = %.1f\n", fmod(5.1, 3));
    printf("fmod(-5.1, +3.0) = %.1f\n", fmod(-5.1, 3));
    printf("fmod(+5.1, -3.0) = %.1f\n", fmod(5.1, -3));
    printf("fmod(-5.1, -3.0) = %.1f\n", fmod(-5.1, -3));
    // special values
    printf("fmod(+0.0, 1.0) = %.1f\n", fmod(0, 1));
    printf("fmod(-0.0, 1.0) = %.1f\n", fmod(-0.0, 1));
    printf("fmod(+5.1, Inf) = %.1f\n", fmod(5.1, INFINITY));
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("fmod(+5.1, 0) = %.1f\n", fmod(5.1, 0));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID raised");
}

Salida posible:

fmod(+5.1, +3.0) = 2.1
fmod(-5.1, +3.0) = -2.1
fmod(+5.1, -3.0) = 2.1
fmod(-5.1, -3.0) = -2.1
fmod(+0.0, 1.0) = 0.0
fmod(-0.0, 1.0) = -0.0
fmod(+5.1, Inf) = 5.1
fmod(+5.1, 0) = nan
    FE_INVALID raised

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.12.10.1 Las funciones fmod (p: TBD)
  • 7.25 Matemáticas genéricas de tipos <tgmath.h> (p: TBD)
  • F.10.7.1 Las funciones fmod (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.12.10.1 Las funciones fmod (p: 185)
  • 7.25 Matemáticas genéricas de tipos <tgmath.h> (p: 274-275)
  • F.10.7.1 Las funciones fmod (p: 385)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.12.10.1 Las funciones fmod (p: 254)
  • 7.25 Matemáticas genéricas de tipos <tgmath.h> (p: 373-375)
  • F.10.7.1 Las funciones fmod (p: 528)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.12.10.1 Las funciones fmod (p: 235)
  • 7.22 Matemáticas genéricas de tipo <tgmath.h> (p: 335-337)
  • F.9.7.1 Las funciones fmod (p: 465)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.5.6.4 La función fmod

Véase también

calcula el cociente y el resto de la división de enteros
(función)
calcula el resto con signo de la operación de división en coma flotante
(función)
(C99) (C99) (C99)
calcula el resto con signo así como los tres últimos bits de la operación de división
(función)