Namespaces
Variants

remainder, remainderf, remainderl

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
remainder
(C99)
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
Macro constants
Special floating-point values
Arguments and return values
Error handling
Fast operation indicators
Определено в заголовочном файле <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)
1-3) Вычисляет IEEE остаток от операции деления с плавающей запятой x / y .
4) Макрос общего типа: Если любой аргумент имеет тип 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, если поддерживается).

Если происходит ошибка диапазона из-за потери значимости (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)
вычисляет знаковый остаток, а также три последних бита операции деления
(функция)
C++ documentation для remainder