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) |
x/y.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
См. также
|
(C99) | вычисляет частное и остаток от целочисленного деления (функция) |
|
(C99)(C99)(C99) | вычисляет знаковый остаток от операции деления с плавающей точкой (функция) |
|
(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