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) |
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
ведёт себя так, как если бы была реализована следующим образом:
Пример
#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)
(C99)
|
вычисляет знаковый остаток от операции деления чисел с плавающей запятой
(функция) |
|
(C99)
(C99)
(C99)
|
вычисляет знаковый остаток, а также три последних бита операции деления
(функция) |
|
C++ documentation
для
fmod
|
|