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) |
x/y.long double, вызывается 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, если поддерживается).
Если возникает ошибка диапазона из-за потери порядка, возвращается правильный результат.
Если 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], выходящем за пределы диапазона signedshort.
Пример
#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));
// special values
printf("remainder(-0.0, 1.0) = %.1f\n", remainder(-0.0, 1));
printf("remainder(+5.1, Inf) = %.1f\n", remainder(5.1, INFINITY));
// error handling
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++ для remainder |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/numeric/math/remainder