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
Определено в заголовке <math.h>
float fmodf ( float x, float y ) ;
(1) (начиная с C99)
double fmod ( double x, double y ) ;
(2)
long double fmodl ( long double x, long double y ) ;
(3) (начиная с C99)
Определено в заголовке <tgmath.h>
#define fmod( x, y )
(4) (начиная с C99)
1-3) Вычисляет остаток от деления с плавающей запятой операции x / y .
4) Макрос общего типа: Если любой аргумент имеет тип long double , fmodl вызывается. В противном случае, если любой аргумент имеет целочисленный тип или тип double , fmod вызывается. В противном случае, fmodf вызывается.

Вещественный остаток от операции деления x / y , вычисляемый данной функцией, точно равен значению x - n * y , где n является результатом x / y с усечённой дробной частью.

Возвращаемое значение имеет тот же знак, что и x , и по модулю меньше или равно y .

Содержание

Параметры

x, y - значения с плавающей запятой

Возвращаемое значение

В случае успеха возвращает остаток от деления с плавающей запятой x / y в соответствии с определением выше.

Если происходит ошибка области определения, возвращается значение, определяемое реализацией (NaN, если поддерживается).

Если происходит ошибка диапазона из-за потери значимости (underflow), возвращается корректный результат (после округления).

Обработка ошибок

Ошибки сообщаются, как указано в math_errhandling .

Ошибка области определения может возникнуть, если y равен нулю.

Если реализация поддерживает арифметику с плавающей запятой IEEE (IEC 60559):

  • Если x равен ±0 и y не равен нулю, возвращается ±0.
  • Если x равен ±∞ и y не является NaN, возвращается NaN и возбуждается FE_INVALID .
  • Если y равен ±0 и x не является NaN, возвращается NaN и возбуждается FE_INVALID .
  • Если y равен ±∞ и x конечен, возвращается x .
  • Если любой аргумент является NaN, возвращается NaN.

Примечания

POSIX требует возникновения ошибки домена, если x является бесконечным или y равен нулю.

fmod , но не remainder , полезен для бесшумного оборачивания типов с плавающей точкой в беззнаковые целочисленные типы: ( 0.0 <= ( y = fmod ( rint ( x ) , 65536.0 ) ) ? y : 65536.0 + y ) находится в диапазоне [ - 0.0 , 65535.0 ] , что соответствует unsigned short , но remainder ( rint ( x ) , 65536.0 ) находится в диапазоне [ - 32767.0 , + 32768.0 ] , что выходит за пределы диапазона signed short .

double версия функции fmod ведёт себя так, как если бы была реализована следующим образом:

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);
}

Пример

#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));
    // специальные значения
    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));
    // обработка ошибок
    feclearexcept(FE_ALL_EXCEPT);
    printf("fmod(+5.1, 0) = %.1f\n", fmod(5.1, 0));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID raised");
}

Возможный вывод:

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

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.12.10.1 Функции fmod (стр.: TBD)
  • 7.25 Обобщённая математика <tgmath.h> (стр.: TBD)
  • F.10.7.1 Функции fmod (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.12.10.1 Функции fmod (стр. 185)
  • 7.25 Обобщённая математика <tgmath.h> (стр. 274-275)
  • F.10.7.1 Функции fmod (стр. 385)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.12.10.1 Функции fmod (стр. 254)
  • 7.25 Обобщенная математика <tgmath.h> (стр. 373-375)
  • F.10.7.1 Функции fmod (стр. 528)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.12.10.1 Функции fmod (стр. 235)
  • 7.22 Обобщенная математика <tgmath.h> (стр. 335-337)
  • F.9.7.1 Функции fmod (стр. 465)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.5.6.4 Функция fmod

Смотрите также

вычисляет частное и остаток от целочисленного деления
(функция)
вычисляет знаковый остаток от операции деления чисел с плавающей запятой
(функция)
(C99) (C99) (C99)
вычисляет знаковый остаток, а также три последних бита операции деления
(функция)