remainder, remainderf, remainderl
Defined in header <math.h> |
||
|---|---|---|
float remainderf( float x, float y ); |
(1) | (since C99) |
double remainder( double x, double y ); |
(2) | (since C99) |
long double remainderl( long double x, long double y ); |
(3) | (since C99) |
Defined in header <tgmath.h> |
||
#define remainder( x, y ) |
(4) | (since 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], что выходит за пределы диапазона signed short.
Пример
#include <stdio.h>
#include <math.h>
#include <fenv.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Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.12.10.2 Функции remainder (с. 185-186)
- 7.25 Универсальная математика типов <tgmath.h> (с. 272-273)
- F.10.7.2 Функции remainder (с. 385)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.12.10.2 Функции remainder (с. 254-255)
- 7.25 Универсальная математика типов <tgmath.h> (с. 373-375)
- F.10.7.2 Функции remainder (с. 529)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.12.10.2 Функции remainder (с. 235)
- 7.22 Универсальная математика типов <tgmath.h> (с. 335-337)
- F.9.7.2 Функции remainder (с. 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/w/c/numeric/math/remainder