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) Универсальный макрос: Если любой аргумент имеет тип long double, вызывается 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], что соответствует 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 <stdio.h>
#include <math.h>
#include <fenv.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

Ссылки

  • Стандарт 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/w/c/numeric/math/fmod

Spec-Zone.ru

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