std:: remainder, std:: remainderf, std:: remainderl
|
Определено в заголовке
<cmath>
|
||
| (1) | ||
|
float
remainder
(
float
x,
float
y
)
;
double
remainder
(
double
x,
double
y
)
;
|
(до C++23) | |
|
constexpr
/*floating-point-type*/
remainder
(
/*floating-point-type*/
x,
|
(начиная с C++23) | |
|
float
remainderf
(
float
x,
float
y
)
;
|
(2) |
(начиная с C++11)
(constexpr начиная с C++23) |
|
long
double
remainderl
(
long
double
x,
long
double
y
)
;
|
(3) |
(начиная с C++11)
(constexpr начиная с C++23) |
|
SIMD перегрузка
(начиная с C++26)
|
||
|
Определено в заголовке
<simd>
|
||
|
template
<
class
V0,
class
V1
>
constexpr
/*math-common-simd-t*/
<
V0, V1
>
|
(S) | (начиная с C++26) |
|
Дополнительные перегрузки
(начиная с C++11)
|
||
|
Определено в заголовке
<cmath>
|
||
|
template
<
class
Integer
>
double remainder ( Integer x, Integer y ) ; |
(A) | (constexpr начиная с C++23) |
std::remainder
для всех неквалифицированных cv типов с плавающей запятой в качестве типа параметров.
(since C++23)
|
S)
SIMD перегрузка выполняет поэлементное вычисление
std::remainder
для
v_x
и
v_y
.
|
(since C++26) |
|
A)
Для всех целочисленных типов предоставлены дополнительные перегрузки, которые трактуются как
double
.
|
(since C++11) |
Остаток от деления с плавающей запятой по стандарту IEEE, вычисляемый этой функцией, в точности равен значению x / y , где значение quo является целочисленным значением, ближайшим к точному значению x / y . Когда |quo - x / y| = ½ , значение quo выбирается чётным.
В отличие от std::fmod , возвращаемое значение не гарантирует того же знака, что и x .
Если возвращаемое значение равно нулю, оно будет иметь тот же знак, что и 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 равен нулю.
std::fmod
, но не
std::remainder
, полезен для бесшовного оборачивания типов с плавающей точкой в беззнаковые целочисленные типы:
(
0.0
<=
(
y
=
std::
fmod
(
std::
rint
(
x
)
,
65536.0
)
)
)
?
y
:
65536.0
+
y
находится в диапазоне
[
-
0.0
,
65535.0
]
, что соответствует
unsigned
short
, но
std
::
remainder
(
std::
rint
(
x
)
,
65536.0
)
находится в диапазоне
[
-
32767.0
,
+
32768.0
]
, что выходит за пределы диапазона
signed
short
.
Дополнительные перегрузки не обязаны быть предоставлены в точности как (A) . Они лишь должны быть достаточными для обеспечения того, чтобы для их первого аргумента num1 и второго аргумента num2 :
|
(до C++23) |
|
Если
num1
и
num2
имеют арифметические типы, тогда
std
::
remainder
(
num1, num2
)
имеет тот же эффект, что и
std
::
remainder
(
static_cast
<
/*common-floating-point-type*/
>
(
num1
)
,
Если такого типа с плавающей запятой с наибольшим рангом и подрангом не существует, тогда разрешение перегрузки не приводит к пригодному кандидату из предоставленных перегрузок. |
(начиная с C++23) |
Пример
#include <cfenv> #include <cmath> #include <iostream> // #pragma STDC FENV_ACCESS ON int main() { std::cout << "remainder(+5.1, +3.0) = " << std::remainder(5.1, 3) << '\n' << "remainder(-5.1, +3.0) = " << std::remainder(-5.1, 3) << '\n' << "remainder(+5.1, -3.0) = " << std::remainder(5.1, -3) << '\n' << "remainder(-5.1, -3.0) = " << std::remainder(-5.1, -3) << '\n'; // special values std::cout << "remainder(-0.0, 1.0) = " << std::remainder(-0.0, 1) << '\n' << "remainder(5.1, Inf) = " << std::remainder(5.1, INFINITY) << '\n'; // error handling std::feclearexcept(FE_ALL_EXCEPT); std::cout << "remainder(+5.1, 0) = " << std::remainder(5.1, 0) << '\n'; if (fetestexcept(FE_INVALID)) std::cout << " FE_INVALID raised\n"; }
Возможный вывод:
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
remainder(5.1, Inf) = 5.1
remainder(+5.1, 0) = -nan
FE_INVALID raised
Смотрите также
|
(C++11)
|
вычисляет частное и остаток от целочисленного деления
(функция) |
|
(C++11)
(C++11)
|
остаток от операции деления чисел с плавающей точкой
(функция) |
|
(C++11)
(C++11)
(C++11)
|
знаковый остаток, а также три последних бита операции деления
(функция) |
|
C documentation
для
remainder
|
|