remainder, remainderf, remainderl
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Определено в заголовочном файле
<math.h>
|
||
|
float
remainderf
(
float
x,
float
y
)
;
|
(1) | (начиная с C99) |
|
double
remainder
(
double
x,
double
y
)
;
|
(2) | (начиная с C99) |
|
long
double
remainderl
(
long
double
x,
long
double
y
)
;
|
(3) | (начиная с C99) |
|
Определено в заголовочном файле
<tgmath.h>
|
||
|
#define remainder( x, y )
|
(4) | (начиная с C99) |
remainderl
вызывается. В противном случае, если любой аргумент имеет целочисленный тип или тип
double
,
remainder
вызывается. В противном случае,
remainderf
вызывается.
Остаток от деления с плавающей запятой по стандарту IEEE операции
x
/
y
, вычисляемый этой функцией, точно равен значению
x
-
n
*
y
, где значение
n
является целым числом, ближайшим к точному значению
x
/
y
. Когда
|n-x/y| = ½
, значение
n
выбирается чётным.
В отличие от fmod() , возвращаемое значение не гарантированно имеет тот же знак, что и x .
Если возвращаемое значение равно 0 , оно будет иметь тот же знак, что и x .
Содержание |
Параметры
| x, y | - | значения с плавающей запятой |
Возвращаемое значение
В случае успеха возвращает остаток от деления с плавающей запятой в формате IEEE x / y как определено выше.
Если происходит ошибка домена, возвращается значение, определяемое реализацией (NaN, если поддерживается).
Если происходит ошибка диапазона из-за потери значимости (underflow), возвращается корректный результат.
Если y равен нулю, но ошибка домена не возникает, возвращается ноль.
Обработка ошибок
Ошибки сообщаются, как указано в
math_errhandling
.
Ошибка домена может возникнуть, если y равен нулю.
Если реализация поддерживает арифметику с плавающей запятой IEEE (IEC 60559),
- Текущий режим округления не оказывает влияния.
- FE_INEXACT никогда не устанавливается, результат всегда точный.
- Если x равен ±∞ и y не является NaN, возвращается NaN и устанавливается FE_INVALID .
- Если y равен ±0 и x не является NaN, возвращается NaN и устанавливается FE_INVALID .
- Если любой из аргументов является 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
.
Пример
#include <fenv.h> #include <math.h> #include <stdio.h> // #pragma STDC FENV_ACCESS ON int main(void) { printf("remainder(+5.1, +3.0) = %.1f\n", remainder(5.1, 3)); printf("remainder(-5.1, +3.0) = %.1f\n", remainder(-5.1, 3)); printf("remainder(+5.1, -3.0) = %.1f\n", remainder(5.1, -3)); printf("remainder(-5.1, -3.0) = %.1f\n", remainder(-5.1, -3)); // специальные значения printf("remainder(-0.0, 1.0) = %.1f\n", remainder(-0.0, 1)); printf("remainder(+5.1, Inf) = %.1f\n", remainder(5.1, INFINITY)); // обработка ошибок feclearexcept(FE_ALL_EXCEPT); printf("remainder(+5.1, 0) = %.1f\n", remainder(5.1, 0)); if (fetestexcept(FE_INVALID)) puts(" FE_INVALID raised"); }
Вывод:
remainder(+5.1, +3.0) = -0.9
remainder(-5.1, +3.0) = 0.9
remainder(+5.1, -3.0) = -0.9
remainder(-5.1, -3.0) = 0.9
remainder(+0.0, 1.0) = 0.0
remainder(-0.0, 1.0) = -0.0
remainder(+5.1, Inf) = 5.1
remainder(+5.1, 0) = -nan
FE_INVALID raised
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 7.12.10.2 Функции остатка (стр.: TBD)
-
- 7.25 Обобщённая математика <tgmath.h> (стр.: TBD)
-
- F.10.7.2 Функции остатка (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.12.10.2 Функции остатка (стр. 185-186)
-
- 7.25 Обобщенная математика <tgmath.h> (стр. 272-273)
-
- F.10.7.2 Функции остатка (стр. 385)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.12.10.2 Функции остатка (стр. 254-255)
-
- 7.25 Обобщенная математика <tgmath.h> (стр. 373-375)
-
- F.10.7.2 Функции остатка (стр. 529)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.12.10.2 Функции остатка (стр. 235)
-
- 7.22 Обобщенная математика <tgmath.h> (стр. 335-337)
-
- F.9.7.2 Функции остатка (стр. 465)
Смотрите также
|
(C99)
|
вычисляет частное и остаток от целочисленного деления
(функция) |
|
(C99)
(C99)
|
вычисляет остаток от операции деления с плавающей запятой
(функция) |
|
(C99)
(C99)
(C99)
|
вычисляет знаковый остаток, а также три последних бита операции деления
(функция) |
|
C++ documentation
для
remainder
|
|