Spec-Zone.ru › C

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)
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, где поддерживается).

Если возникает ошибка диапазона из-за подпотока, возвращается правильный результат.

Если 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)

См. также

divldivlldiv
(C99)
вычисляет частное и остаток от целочисленного деления
(функция)
fmodfmodffmodl
(C99)(C99)
вычисляет остаток от операции деления с плавающей запятой
(функция)
remquoremquofremquol
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API