Spec-Zone.ru › C

fmod, fmodf, fmodl

Определено в заголовочном файле <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) Обобщённый макрос для типов: если хотя бы один аргумент имеет тип longdouble, вызывается fmodl. В противном случае, если хотя бы один аргумент имеет целочисленный тип или тип double, вызывается fmod. В противном случае вызывается fmodf.

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

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

Параметры

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

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

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

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

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

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

Об ошибках сообщается в соответствии с указаниями в 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], который соответствует типу unsignedshort, тогда как remainder(rint(x), 65536.0) находится в диапазоне [-32767.0, +32768.0], выходящем за пределы диапазона типа signedshort.

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

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

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

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

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

См. также

divldivlldiv
(C99)
вычисляет частное и остаток от целочисленного деления
(функция)
remainderremainderfremainderl
(C99)(C99)(C99)
вычисляет знаковый остаток от деления чисел с плавающей точкой
(функция)
remquoremquofremquol
(C99)(C99)(C99)
вычисляет знаковый остаток, а также три последних бита результата деления
(функция)
Документация C++ для fmod

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/numeric/math/fmod

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API