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.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
См. также
|
(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/c/numeric/math/fmod